繁体   English   中英

通用静态字段初始化

[英]Generic static fields initialization

我只是对以下代码感到好奇:

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

据我所知,静态类 Container 将在以下代码执行时初始化:

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

我对吗 ? 任何关于静态泛型类/成员初始化的解释将不胜感激。 提前致谢。

保证静态字段在您访问它之前被初始化。 (而且,如果还有一个静态构造函数,那么所有静态字段都将在静态构造函数运行之前被初始化。)

对于泛型类,静态初始化基于每个类型工作,因此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

静态字段初始值设定项实际上移到类的静态构造函数(类型初始值设定项)中。 所以你的代码会自动编译成这个:

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

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

MSDN关于静态构造函数:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM