2012-08-08 48 views
10

考慮以下類:爲什麼不是在用作泛型類型參數的類上調用靜態構造函數?

public class Foo { 
    static Foo() { 
     Console.WriteLine("Foo is being constructed"); 
    } 
} 

public class Bar { 
    public void ReferenceFooAsGenericTypeParameter<T>() { 
     Console.WriteLine("Foo is being referenced as a generic type parameter"); 
    } 
} 

public class SampleClass 
{ 
    public static void Main() 
    { 
     new Bar().ReferenceFooAsGenericTypeParameter<Foo>(); 
    } 
} 

輸出是

Foo is being referenced as a generic type parameter

這是有道理的,依據規範:

靜態構造函數被自動調用之前初始化類第一個實例被創建或者任何靜態成員被引用。

但我很好奇爲什麼當類型被引用爲泛型類型參數時不會調用靜態構造函數。

+0

良好的問題伴侶,今天有一點點我 – 2016-07-06 02:40:47

回答

6

它爲什麼需要?

被正常調用的靜態構造函數的意義在於確保靜態構造函數中設置的任何狀態在第一次使用之前被初始化。

僅使用Foo作爲類型參數不會使用其中的任何狀態,因此不需要調用靜態構造函數。

你可能想嘗試創建具有副作用的靜態變量初始化(例如一個方法調用它然後打印到控制檯),並刪除靜態構造函數 - 在某些情況下can affect the timing of initialization significantly。它可能觸發它在這裏。

+0

我想到了很多。感謝您的澄清和鏈接。 – arootbeer 2012-08-08 22:30:59

1

那是因爲你不能真正只是包含作爲泛型類型參數使用類型的內容以任何有意義的方式,類型需要有一些做它來保證靜態構造函數被調用。

而且你是正確的,這是符合規範。部分10.12(靜態構造)規定:

靜態構造 的執行由第一以下事件的至 應用程序域內發生觸發:

·類類型的一個實例是創建。

·引用了類類型的任何靜態成員。

用作泛型類型參數既不是這些。

+0

問題已經承認行爲是根據規範,但問爲什麼規範的書寫方式,它是。 – hvd 2012-08-08 22:20:17

+0

@ hvd謝謝,錯過了。答覆已更改。 – 2012-08-08 22:24:48

0

這裏要注意的一點是,在new Bar().ReferenceFooAsGenericTypeParameter<Foo>();您已經創建類型酒吧的對象,既不是你的主,也不酒吧有創造的Foo一個實例也沒有任何它的成員被訪問,在情況介紹中,鍵入本身只是作爲參數傳遞。

相關問題