我习惯于编写这样的类:
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#5之前)还没有发生过,但是计划在C#6中使用-既允许在声明时进行初始化, 又 允许在构造函数主体中初始化只读的自动实现属性。