关于.net:C#访问器和初始化

C# Accessor and initialization

本问题已经有最佳答案,请猛点这里访问。

如何将访问器声明和初始化结合起来

1
2
3
List<string> listofcountries= new List<string>();
and
List<string>listofcountries {get;set;}

有没有办法把这些结合到陈述中?


你现在不能。您将能够在C 6中:

1
List<string> Countries { get; set; } = new List<string>();

甚至可以在C 6(hooray!)中将其设置为只读属性。:

1
List<string> Countries { get; } = new List<string>();

在C 5中,您可以使用非自动实现的属性:

1
2
3
// Obviously you can make this read/write if you want
private readonly List<string> countries = new List<string>();
public List<string> Countries { get { return countries; } }

…或者在构造函数中初始化它:

1
2
3
4
5
6
public List<string> Countries { get; set; }

public Foo()
{
    Countries = new List<string>();
}


不在同一句话中。但是,您可以在构造函数体中完成它。


可以使用构造函数,也可以创建自定义getter/setter:

构造函数

1
2
3
4
5
6
7
8
9
public class Foo
{
    public Foo()
    {
        listofcountries = new List<string>();
    }

    public List<string> listofcountries { get; set; }
}

自定义getter/setter

1
2
3
4
5
6
7
8
9
10
11
12
13
private List<string> _listofcountries;
public List<string> listofcountries
{
    get
    {
        if (_listofcountries == null)
        {
            _listofcountries = new List<string>();
        }
        return _listofcountries;
    }
    set { _listofcountries = value; }
}

值得一提的是,公约规定公共财产应采用驼色的形式:以东x1(0),而不是以东x1(0)。然后,属性的私有实例变量也将采用驼色大小写,但第一个字母小写:ListOfCountries,而不是_listofcountries

像往常一样更新双向飞碟。一旦C 6击中,那么他的回答将是最好的方式,手放低。在较小的版本中,您会坚持使用我发布的方法。


仅限于C 6。

我通常喜欢做的是:

1
2
3
4
5
6
7
8
9
10
11
12
13
  private List<string> list;
  public List<string> List
  {
     get
     {
         if(list == null)
         {
            list = new List<string>();
         }

         return list;  
     }
  }