[英]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.