c# - 为什么我们需要静态私有(private)数组来初始化其他非静态私有(private)数组字段?

标签 c# constructor field private-members

如果你看看里面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/

相关文章:

c# - 如何在 .NET C# WinService 中使用 COM 服务器(ATL、DLL 代理)?

java - 具有许多必需参数的构造函数

java - Getter 方法返回错误值

java - super ()难题

c# - 为什么设置字段比获取字段慢很多倍?

c# - 如何合并 3 个关节并将图像叠加到其上,以便图像旋转

c# - 多重绑定(bind)错误

c# - 如何获取有关最近连接的 USB 设备的信息?

xml - 如何在 openerp 的 one2many 上隐藏一个字段?

C++ const public 字段与 getter 方法