是否可以在声明点初始化属性

时间:2010-11-01 15:19:08

标签: c# c#-4.0

想象一下,你在课堂上有一个字段_items。您可以在声明点初始化它:

class C
{
  IList<string> _items=new List<string>();
}

现在我想将此字段转换为自动生成的属性,但现在初始化无效:

class C
{
  public IList<string> Items=new List<string>(); {get; set;} // Invalid
}

所以,我必须这样做:

class C
{
  public IList<string> Items {get; set;}

  public C
  {
    Items=new List<string>();
  }
}

但这并不像在声明点初始化字段那样方便。有没有更好的方法来做到这一点,而不必(不必要地)使用私有(在声明点初始化)字段来支持此属性,例如。

由于

7 个答案:

答案 0 :(得分:19)

不,自动属性不允许您设置初始值。

这很烦人,但这就是生活。 (令人讨厌的是,他们也不能只阅读。但那是另一天的咆哮。)

编辑:两个只读自动实现的属性和指定初始值都将在C#6中。

答案 1 :(得分:5)

在c#6中你可以这样写:

class C
{
    public IList<string> Items {get; set;} = new List<string>();
}

答案 2 :(得分:0)

不,这是唯一的方法。

答案 3 :(得分:0)

由于在使用{ get; set; }时未声明该字段,因此无法指定初始值。

因此,您需要自己声明字段或在构造函数中初始化它。

答案 4 :(得分:0)

使用私有支持字段或在构造函数中设置值是向属性提供初始值的唯一方法。

答案 5 :(得分:0)

我不相信 - 正如您所展示的那样,构建是下一个最佳方式,因此您不必使用私有支持者,然后使用构造函数链接来确保该属性始终初始化:< / p>

public MyClass() { PropA = default_Value; }
public MyClass(params object[] args) : this() { /* other code */ }

这将是一个很好的功能;但是,自动实现的属性可以简化类型的属性实现;我无法看到你如何在语言层面为自动属性添加默认值功能,而代码看起来不那么奇怪。

但是,那就是我不是语言设计师的原因。

答案 6 :(得分:0)

我担心在声明它时无法直接初始化auto属性。我同意这很可惜。我不知道任何更好的方法,然后构造函数。 另请参阅Initializing C# auto-properties