簡體   English   中英

為什么不在用作泛型類型參數的類上調用靜態構造函數?

[英]Why isn't a static constructor invoked on a class used as a generic type parameter?

鑒於以下類別:

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

根據規范,這是有道理的:

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

但我很好奇為什么在將類型作為泛型類型參數引用時不調用靜態構造函數。

它為什么需要?

正常調用靜態構造函數的要點是確保在靜態構造函數中設置的任何狀態在首次使用之前進行初始化。

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

您可能想嘗試創建一個帶有副作用的靜態變量初始化程序(例如, 然后打印到控制台的方法調用)並刪除靜態構造函數 - 這在某些情況下會顯着影響初始化的時間 可能在這里觸發它。

那是因為你不能通過包含作為泛型類型參數以任何有意義的方式實際使用類型內容,類型需要對其進行一些操作以保證調用靜態構造函數。

你是對的,這符合規范。 第10.12節(靜態構造函數)聲明:

靜態構造函數的執行由應用程序域中發生的以下第一個事件觸發:

·創建類類型的實例。

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

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

這里需要注意的是new Bar().ReferenceFooAsGenericTypeParameter<Foo>(); 你創建了一個Bar類型的對象,你的main和Bar都沒有創建一個Foo實例,也沒有訪問過它的任何成員,在這種情況下,類型本身只是作為一個參數傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM