2011-09-16 41 views
4

我刚开始好奇下面的代码:通用静态字段初始化

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

正如我已经理解了静态类容器将被初始化时,下面的代码执行:

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

我对吗 ?赞赏静态泛型类/成员初始化的任何解释。提前致谢。

+0

是的你是正确的 –

回答

7

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

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

3

静态字段初始真的搬进类的静态构造函数(类型初始化)。所以,你的代码编译成这个自动的:

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

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

MSDN关于静态构造函数:

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

由于Container<string>Container<bool>是不一样的,静态构造函数为每种类型的T调用一次。

+0

我误解了静态构造函数的想法 - 我认为静态构造函数在程序开始时被调用,所以这段代码示例对我来说似乎很奇怪。谢谢。 – danyloid

+0

@danyloid:允许运行时在类的成员使用之前随时调用静态构造函数。这*可以*在程序的开始,或者在你第一次实际使用它之前。 – porges

+0

@Porges谢谢。 – danyloid