通用静态字段初始化

5

我对以下代码感到好奇:

public static class Container<T>
{
    public static readonly T[] EmptyArray = new T[0];
}

我理解,当执行以下代码时,静态类容器将被初始化:

...
var emptyArray = Container<int>.EmptyArray;
...

我理解你的意思了,静态泛型类/成员初始化的任何解释都将受到赞赏。先谢谢。

2个回答

8
保证静态字段在访问之前已被初始化。(同时,如果还有静态构造函数,则在运行静态构造函数之前将初始化所有静态字段。)
对于泛型类,静态初始化是基于每个类型的基础进行的,因此Container<int>Container<double>作为完全不同的类来处理。事实上,在泛型类的所有静态部分中都是如此 - 每种类型都有自己的'副本'。
下面的示例将更清楚地展示这一点:
static class Foo<T>
{
    static int count = 0;
    public static int Increment()
    {
        return ++count;
    }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(Foo<int>.Increment());
        Console.WriteLine(Foo<int>.Increment());
        Console.WriteLine(Foo<double>.Increment());
    }
}

输出:

1
2
1

1
哦,所以答案是“是的” :) - porges

5

静态字段初始化器实际上是被移动到类的静态构造函数(类型初始化器)中。所以您的代码会自动编译成以下内容:

public static class Container<T>
{
    public static readonly T[] EmptyArray;

    static Container()
    {
        EmptyArray = new T[];
    }
}

关于静态构造函数,MSDN的解释如下:

在创建第一个实例或引用任何静态成员之前,将自动调用它[静态构造函数]。

由于Container<string>Container<bool>不同,因此对于每种类型的T,静态构造函数会被调用一次。


我曾经误解了静态构造函数的想法 - 我以为静态构造函数在程序开始时就被调用,所以这段代码示例对我来说看起来很奇怪。谢谢。 - danyloid
@danyloid:运行时允许在类成员被使用之前的任何时间调用静态构造函数。这可能发生在程序启动时,也可能在您首次实际使用它之前。 - porges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接