一个类在静态构造函数中创建自身的实例是否安全?

时间:2012-02-20 09:46:12

标签: c#

我偶然发现了一个问题,我需要在其静态构造函数中使用该类的实例。我认为不可能这样做所以我尝试了以下内容:

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。让我们忽略这样一个事实,即可以通过使用不同的方法来避免这种情况。

3 个答案:

答案 0 :(得分:5)

specification所说的所有内容都是在创建类的任何实例之前调用静态构造函数。但它没有说明这个构造函数必须完成的事实:

  

静态构造函数用于初始化任何静态数据,或者   执行仅需要执行一次的特定操作。它   在创建第一个实例或任何实例之前自动调用   静态成员被引用。

你可以完美地在静态构造函数中创建类的实例,这是安全的。

答案 1 :(得分:0)

在创建第一个实例之前自动调用静态构造函数,或者引用任何静态成员引用任何静态字段。因此,当您的应用程序运行并且您访问Foo时,会执行静态构造函数并初始化您的字符串。

安全吗?:因此这样做没有害处。它只是执行一次。

有关此阅读Static Classes and Static Class Members on MSDN

的信息

答案 2 :(得分:0)

它是安全的,因为它只会被调用一次。