初始化C#自动属性
我习惯于这样写类:
public class foo { private string mBar = "bar"; public string Bar { get { return mBar; } set { mBar = value; } } //... other methods, no constructor ... }
将Bar转换为自动属性看起来方便简洁,但是如何在不添加构造函数的情况下保留初始化并将初始化放在那里呢?
public class foo2theRevengeOfFoo { //private string mBar = "bar"; public string Bar { get; set; } //... other methods, no constructor ... //behavior has changed. }
你可以看到,添加一个构造函数不是内联的,我应该从自动属性中获得这些努力。
像这样的东西对我来说会更有意义:
public string Bar { get; set; } = "bar";
更新 – 下面的答案是在C#6出现之前编写的。 在C#6中,您可以编写:
public class Foo { public string Bar { get; set; } = "bar"; }
您也可以编写只读自动实现的属性,这些属性只能在构造函数中写入(但也可以赋予默认的初始值:
public class Foo { public string Bar { get; } public Foo(string bar) { Bar = bar; } }
不幸的是,现在没有办法做到这一点。 你必须在构造函数中设置值。 (使用构造函数链可以帮助避免重复。)
自动实现的属性现在是方便的,但可以肯定更好。 我不觉得自己需要这种初始化,就像只能在构造函数中设置的只读自动实现的属性一样,并且只能通过只读字段来支持。
直到包括C#5在内,都没有发生,但是正在为C#6进行规划 – 无论是在声明中允许初始化, 还是允许在构造函数体中初始化只读自动实现的属性。
你可以通过你的类的构造函数来完成:
public class foo { public foo(){ Bar = "bar"; } public string Bar {get;set;} }
如果你有另一个构造函数(也就是一个需要参数的构造函数)或者一堆构造函数,你总是可以拥有这个构造函数(称为构造函数链):
public class foo { private foo(){ Bar = "bar"; Baz = "baz"; } public foo(int something) : this(){ //do specialized initialization here Baz = string.Format("{0}Baz", something); } public string Bar {get; set;} public string Baz {get; set;} }
如果您始终将调用链接到默认的构造函数,则可以在其中设置所有的默认属性初始化。 链接时,链接的构造函数将在调用构造函数之前调用,以便更专业的构造函数可以根据需要设置不同的默认值。
这将是可能的在C#6.0中:
public int Y { get; } = 2;
在默认的构造函数中(如果你有任何非默认的构造函数):
public foo() { Bar = "bar"; }
这相当于你的原始代码,我相信,因为这是在幕后发生的事情。