【问题标题】:Initializing default values for private fields in constructors explicitely.. WTF?显式初始化构造函数中私有字段的默认值.. WTF?
【发布时间】:2011-04-06 04:13:54
【问题描述】:
考虑以下来自 .NET 4.0 库的代码 sn-p:
private T[] array;
private static T[] emptyArray;
private int size;
private int version;
static Stack()
{
Stack<T>.emptyArray = new T[0];
}
public Stack()
{
array = Stack<T>.emptyArray;
size = 0;
version = 0;
}
除了公司的编码标准之外,将值类型私有字段初始化为默认值(上例中的size 和version)是否有任何原因?
【问题讨论】:
标签:
c#
constructor
coding-style
default-value
【解决方案1】:
我认为初始化集合通常是一种很好的做法,主要是因为它可以确保开发人员在使用时不需要初始化任何东西,而只是假设变量已被初始化。
public class Store
{
public Store()
{
// Ready to go!
Products = new List<Product>();
}
public string Id {get;set;}
public IList<Product> Products {get;set;}
}
您跳过了必须检查集合是否已初始化的麻烦,如果没有这样做,否则... 打哈欠
【解决方案2】:
IMO,将私有变量初始化为它们的 默认 值没有必要也没有好处(除非它是标准的一部分)。
编辑:几次,它可能是有意义的(因为它提高了代码的可读性) - 例如
public const OP_GET = 0;
public const OP_ADD = 1;
...
private int operation = OP_GET;
【解决方案3】:
如果它们是原始数据类型,则无需初始化,它们将始终采用默认值
int、long 等的默认值为 0,而 bool 的默认值为 false 等。
如果它是一个引用类型,您可能需要初始化,以便它们具有一些默认值(根据您的逻辑)并避免空引用错误
【解决方案4】:
不,没有,至少不是技术原因。也许在某些情况下,人们可能会这样做来说明一点,例如,如果您有某种类型的计数器变量并且您想明确它从零开始。但我认为即使这样也有点问题。