在性能方面,没有真正的区别;字段初始值设定项被实现为构造函数逻辑。唯一的区别是字段初始值设定项发生在任何“base”/“this”构造函数之前。
构造函数方法可以与自动实现的属性一起使用(字段初始值设定项不能) - 即
[DefaultValue("")]
public string Foo {get;set;}
public Bar() { // ctor
Foo = "";
}
除此之外,我更喜欢字段初始值设定项语法;我发现它可以使事情本地化-即
private readonly List<SomeClass> items = new List<SomeClass>();
public List<SomeClass> Items {get {return items;}}
我不必四处寻找它被分配的位置......
明显的例外是您需要执行复杂的逻辑或处理构造函数参数 - 在这种情况下,基于构造函数的初始化是要走的路。同样,如果您有多个构造函数,则最好始终以相同的方式设置字段 - 因此您可能有如下 ctors:
public Bar() : this("") {}
public Bar(string foo) {Foo = foo;}
编辑:作为旁注,请注意,在上面,如果有其他字段(未显示)具有字段初始化器,那么它们仅在调用的构造函数中直接初始化base(...)
- 即public Bar(string foo)
ctor。另一个构造函数不运行字段初始值设定项,因为它知道它们是由this(...)
ctor 完成的。