私人会员实例化/初始化的最佳实践是什么?

可能重复:
C#成员变量初始化; 最佳实践?

这有什么好处:

public class RemotingEngine { uint m_currentValueId; object m_lock; public RemotingEngine() { m_currentValueId = 0; m_lock = new object(); } 

与此:

 public class RemotingEngine { uint m_currentValueId = 0; object m_lock = new object(); 

我一直在避开第二个因为它感觉“脏”。 它显然不那么打字,所以这对我很有吸引力。

它可以改变inheritance情况。 请参阅对象初始化顺序上的此链接:
http://www.csharp411.com/c-object-initialization/

  1. 派生的静态字段
  2. 派生的静态构造函数
  3. 派生的实例字段
  4. 基本静态字段
  5. 基础静态构造函数
  6. 基本实例字段
  7. 基础实例构造函数
  8. 派生的实例构造函数

因此,如果这是派生类,则在初始化派生字段和构造函数运行之间初始化整个基础对象。

没有太大的区别,我会保留第一个,因为它更具可读性。 通常变量是在类的顶部定义的,我可以去那里检查它们的默认值,而不是搜索构造函数并查看它是否设置它。 就编译器而言,除非您有多个构造函数,否则没有区别。

因为这个原因,我总是使用第一个:构造函数负责初始化变量。 不同的构造函数可以不同地初始化变量。 所以是的,你应该感觉很脏,第二种方式=)。

我更喜欢第二种,在某些情况下,它取决于您的编码标准。 但请考虑处理顺序:

目标类字段初始化 – >基类字段初始化 – >基类构造函数 – >目标类构造函数

如果基类或目标类具有创建对象的exception并且字段是预初始化的,则它将在最终确定时具有值并且可能导致一些意外问题。

另请参阅此博客,Bill Simser 最佳实践和C#中的成员初始化

对于int,你根本不需要这样做,内部类型被初始化为default() – 对于int,它是0。

至于对象,这是品味的问题。 我更喜欢前者。 如果某人覆盖了我的构造函数,我希望它们调用base()来构造它的正确状态。

你希望避免在构造函数范围之外的实例化,因为它显示了intent,特别是如果你重写构造函数,你会有更多的灵活性

就IL而言,它们是相同的。

编译器转为:

 class Foo { int bar = 1; } 

进入这个:

 class Foo { int bar; public Foo() { this.bar = 1; } } 

即使你自己添加一个构造函数如下:

 class Foo { int bar = 1; public Foo(int bar) { this.bar = bar; } } 

编译器将其转换为:

 class Foo { int bar; public Foo(int bar) { this.bar = 1; this.bar = bar; } } 

我对此有不同的看法。 我认为你应该抽象属性并在构造函数中设置它们。 使用自动属性基本上可以消除这个问题,因为你无法初始化它们(除了默认值之外的任何东西)。

 public class RemotingEngine { private uint CurrentValueID { get; set; } private object Lock { get; set; } public RemotingEngine() { this.CurrentValueID = 0; // not really necessary... this.Lock = new object(); } }