我偶然发现了一个问题,我需要在其静态构造函数中使用该类的实例。我认为不可能这样做所以我尝试了以下内容:
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。让我们忽略这样一个事实,即可以通过使用不同的方法来避免这种情况。
答案 0 :(得分:5)
specification所说的所有内容都是在创建类的任何实例之前调用静态构造函数。但它没有说明这个构造函数必须完成的事实:
静态构造函数用于初始化任何静态数据,或者 执行仅需要执行一次的特定操作。它 在创建第一个实例或任何实例之前自动调用 静态成员被引用。
你可以完美地在静态构造函数中创建类的实例,这是安全的。
答案 1 :(得分:0)
在创建第一个实例之前自动调用静态构造函数,或者引用任何静态成员引用任何静态字段。因此,当您的应用程序运行并且您访问Foo
时,会执行静态构造函数并初始化您的字符串。
安全吗?:因此这样做没有害处。它只是执行一次。
的信息答案 2 :(得分:0)
它是安全的,因为它只会被调用一次。