2011-09-16 155 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