簡體   English   中英

類在靜態構造函數中創建其自身的實例是否安全?

[英]Is it safe for a class to create instances of itself inside the static constructor?

我偶然發現了一個需要在其靜態構造函數中包含該類實例的問題。 我認為這是不可能的,所以我嘗試了以下方法:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Foo.someString);
        Console.ReadLine();
    }
}

class Foo
{
    public static readonly string someString;

    static Foo()
    {
        someString = new Foo().CreateString();
    }

    private string CreateString()
    {
        return "some text";
    }
}

令我驚訝的是,它有效-輸出為“一些文本”。 我相信靜態構造函數必須在創建類實例之前運行並完成。 這個答案表明情況並非一定如此。 這是否意味着靜態和實例構造函數彼此獨立? 最后, 這樣做是否安全(在靜態構造函數中創建實例)?

ps讓我們忽略一個事實,即可以通過使用其他方法來避免這種情況。

規范所說的只是在創建類的任何實例之前將調用靜態構造函數。 但這並沒有說明該構造函數必須完成的事實:

靜態構造函數用於初始化任何靜態數據,或執行僅需要執行一次的特定操作。 在創建第一個實例或引用任何靜態成員之前,將自動調用它。

您可以在靜態構造函數中完美地創建類的實例,這是安全的。

在創建第一個實例之前自動調用靜態構造函數,或者 引用了任何靜態成員 任何靜態字段都被引用。 因此,當您的應用程序運行並訪問Foo ,將執行靜態構造函數並初始化您的字符串。

安全嗎? :因此,這樣做無害。 只是它們只執行一次。

有關此信息,請閱讀MSDN上的靜態類和靜態類成員。

這是安全的,因為它只會被調用一次。

暫無
暫無

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

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