如果你看看里面Stack<T>
来自 .NET 4.0 的类,您会注意到有一个“emptyArray”私有(private)静态字段,它在构造函数内部用于初始化一个真正的“数组”私有(private)字段。
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;
}
为什么不直接放 this.array = new T[0];
?还有为什么要为大小和版本字段放置初始化笔画,如果您省略这些行,它们无论如何都会被初始化为默认值 (0)。
最佳答案
那是因为否则,每个 Stack
获取他自己的 new T[0]
实例.现在它们都引用同一个实例:声明为静态的实例。假设您声明 1000 Stack<string>
.这些都引用了一个string[0]
目的。如果您在构造函数中声明了空数组,您将得到一个 1000 string[0]
实例,每个 Stack<string>
.所以这是出于性能原因。
其他初始化器是不必要的,但如果您通过其他源文件查看 Reflector,您会发现到处都是相同的模式:具有默认值的字段在构造函数中被分配显式值。
关于c# - 为什么我们需要静态私有(private)数组来初始化其他非静态私有(private)数组字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3607380/