我习惯写这样的课程:
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";
Jon Skeet.. 211
更新 - 下面的答案是在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 - 无论是在声明点允许初始化还是允许在构造函数体中初始化只读自动实现的属性.
更新 - 下面的答案是在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;