私人会员实例化/初始化的最佳实践是什么?
可能重复:
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/
- 派生的静态字段
- 派生的静态构造函数
- 派生的实例字段
- 基本静态字段
- 基础静态构造函数
- 基本实例字段
- 基础实例构造函数
- 派生的实例构造函数
因此,如果这是派生类,则在初始化派生字段和构造函数运行之间初始化整个基础对象。
没有太大的区别,我会保留第一个,因为它更具可读性。 通常变量是在类的顶部定义的,我可以去那里检查它们的默认值,而不是搜索构造函数并查看它是否设置它。 就编译器而言,除非您有多个构造函数,否则没有区别。
因为这个原因,我总是使用第一个:构造函数负责初始化变量。 不同的构造函数可以不同地初始化变量。 所以是的,你应该感觉很脏,第二种方式=)。
我更喜欢第二种,在某些情况下,它取决于您的编码标准。 但请考虑处理顺序:
目标类字段初始化 – >基类字段初始化 – >基类构造函数 – >目标类构造函数
如果基类或目标类具有创建对象的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(); } }
- static constructors和BeforeFieldInit?
- 如何在Web服务中初始化静态变量
- 是否有Visual Studio Build Profiler?
- 我如何使用方法async Task 并返回字符串,然后如何将该方法的委托传递给构造函数并在以后使用它?
- 无法从一组表达式创建复合表达式<Func >
- MVC3 DropDownList + ViewBag问题
- 没有配置身份validation处理程序来validation该方案:Microsoft.AspNet.Identity.External
- generics的扩展方法
- 如何通过使用C#.NET 4.5将文件从ZIP存档读取到内存而不将其首先解压缩到文件中?