我剛開始好奇下面的代碼:通用靜態字段初始化
public static class Container<T>
{
public static readonly T[] EmptyArray = new T[0];
}
正如我已經理解了靜態類容器將被初始化時,下面的代碼執行:
...
var emptyArray = Container<int>.EmptyArray;
...
我對嗎 ?讚賞靜態泛型類/成員初始化的任何解釋。提前致謝。
我剛開始好奇下面的代碼:通用靜態字段初始化
public static class Container<T>
{
public static readonly T[] EmptyArray = new T[0];
}
正如我已經理解了靜態類容器將被初始化時,下面的代碼執行:
...
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
哦,所以答案是「是」:) – porges
靜態字段初始真的搬進類的靜態構造函數(類型初始化)。所以,你的代碼編譯成這個自動的:
public static class Container<T>
{
public static readonly T[] EmptyArray;
static Container()
{
EmptyArray = new T[];
}
}
從MSDN關於靜態構造函數:
它[靜態構造函數]會自動創建第一個實例之前或調用的任何靜態成員被引用。
由於Container<string>
和Container<bool>
是不一樣的,靜態構造函數爲每種類型的T
調用一次。
是的你是正確的 –