簡體   English   中英

這稱為第一個靜態構造函數或私有構造函數

[英]Which is called first static constructor or private constructor

我正在閱讀實現Singleton的教程,代碼是

public class Singleton
    {
        private static readonly Singleton instance = new Singleton();

        static Singleton()
        {
            Console.WriteLine("Static");
        }
        private Singleton()
        {
            Console.WriteLine("Private");
        }

        public static Singleton Instance { get { return instance; } }

        public void DoSomething() {
            //this must be thread safe
        }
    }

當我寫Singleton.Instance時,輸出是

私人的
靜態的

我期待它

靜態的
私人的

原因是當我閱讀MSDN教程“ https://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx

我看到在靜態構造函數之后調用了公共構造函數。

為什么會有區別?

靜態構造函數必須在類之外的代碼可以使用該類之前完成。 但是語言規范必須允許實例構造函數在靜態構造函數之前完成,這樣你就可以這樣做:

static Singleton()
{
    instance = new Singleton();
    // It has to be legal to use "instance" here
    Console.WriteLine("Static");
}

請注意,在您的示例中,這基本上是發生的事情。 字段初始化器基本上成為構造函數的一部分; 他們只是先執行。

這由生成的IL證實:

// Static constructor
Singleton..cctor:
IL_0000:  newobj      Singleton..ctor     //Calls private constructor first
IL_0005:  stsfld      Singleton.instance  //to create .instance
IL_000A:  nop         
IL_000B:  ldstr       "Static"
IL_0010:  call        System.Console.WriteLine
IL_0015:  nop         
IL_0016:  ret         

另請參閱相關(但不重復)的問題和Eric Lippert在這里的典型答案: 調用靜態構造函數和實例構造函數

暫無
暫無

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

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