2012-07-26 55 views
1

我遇到代碼設置是這樣的:訂單靜態元素的執行初始化

internal class Something 
{ 
    public string Name { get; set; } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 

internal static class Factory 
{ 
    public static string Name { get; set; } 

    public static Something Create() 
    { 
     return new Something { Name = Name }; 
    } 
} 

internal static class Resources 
{ 
    public static readonly Something DefaultSomething = Factory.Create(); 
} 

internal class Program 
{ 
    public static void Main(string[] args) 
    { 
     Factory.Name = "MyFactory"; 
     Execute(); 
     Console.ReadKey(); 
    } 

    private static void Execute() 
    { 
     Console.WriteLine(Resources.DefaultSomething); 
    } 
} 

當然,這只是一個片段,我想沒有深究爲什麼這樣做這樣。

我這個問題是在調試和發佈運行時沒有調試器行爲的差異:

  • 調試或調試器發佈:MyFactory打印到控制檯
  • 釋放無調試器:空行打印

很明顯,問題在於執行靜態元素的初始化順序和在發佈模式下編譯時執行的一些優化。我想知道如何解決這個問題,而不需要制動這個設置。

+0

對不起

internal static class Resources { public static readonly Something DefaultSomething = Factory.Create(); static Resources() { } } 

編輯this article,但我的機器(VS2010/.NET4)就可以輸出MyFactory在Release下。 – 2012-07-26 08:32:51

+0

你是否在沒有調試器的情況下運行exe文件? – Rafal 2012-07-26 08:36:37

+0

這是與Jit有關的事情,代碼是提前編譯的,所以Resource類在工廠類之前被引用。當然,你應該使用一個屬性getter並初始化第一次獲取的值? – 2012-07-26 08:40:31

回答

5

修復的方法是靜態構造函數添加到資源類:由喬恩斯基特

+0

確定您的解決方案有效,但我想知道爲什麼。 – Rafal 2012-07-26 08:41:41

+0

我添加了一個鏈接到Jon Skeet關於這個主題的文章。 – 2012-07-26 08:43:33