我偶然發現了一個問題,我需要在其靜態構造函數中的類的實例。我認爲這是不可能做到這一點,所以我嘗試了以下內容:一個類在靜態構造函數中創建自己的實例是否安全?
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";
}
}
令我驚訝的是,它的工作原理 - 輸出「一些文本」。我相信靜態構造函數必須在創建類的實例之前運行並完成。 This answer表明這不一定是這種情況。這是否意味着靜態和實例構造函數是相互獨立的?最後,是否安全(在靜態構造函數中創建實例)?
p.s.讓我們忽略這一事實,即可以通過使用不同的方法來避免這種情況。
取決於安全性的定義,實例化的位置和創建實例的用法 – 2012-02-20 09:55:34
@Rune FS - 安全地執行與示例類似的操作 - 初始化靜態成員變量 – loodakrawa 2012-02-20 09:59:55
靜態構造函數時要小心依賴於其他靜態構造函數。儘量不要獲得循環依賴,因爲這會導致您在靜態初始化器完成運行之前訪問成員並創建類的實例。框架不會爲此提醒你(即沒有例外或死鎖)。 – Ruben 2012-02-20 10:10:13