小编典典

C#成员变量初始化;最佳实践?

c#

在声明时初始化类成员变量更好吗

private List<Thing> _things = new List<Thing>();
private int _arb = 99;

或默认构造函数中?

private List<Thing> _things;
private int _arb;

public TheClass()
{
  _things = new List<Thing>();
  _arb = 99;
}

仅仅是样式问题还是性能折衷,一种或另一种方式?


阅读 265

收藏
2020-05-19

共1个答案

小编典典

在性能方面,没有真正的区别;字段初始化程序被实现为构造函数逻辑。唯一的区别是,字段初始化程序发生在任何“ 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;}}

我不必上上下下寻找它的分配位置…

一个明显的例外是需要执行复杂的逻辑或处理构造函数参数的情况-
在这种情况下,基于构造函数的初始化是必经之路。同样,如果您有多个构造函数,则最好始终以相同的方式设置字段-因此您可能会有以下类似的ctor:

public Bar() : this("") {}
public Bar(string foo) {Foo = foo;}

编辑:作为附带的注释,请注意,在上面,如果还有其他带有字段初始值设定项的字段(未显示),则只能在调用的构造函数base(...)(即public Bar(string foo)ctor)中直接对其进行初始化。另一个构造函数 运行字段初始化程序,因为它知道它们是由this(...)ctor
完成的。

2020-05-19