Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类在静态构造函数中创建自身的实例是否安全?_C# - Fatal编程技术网

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

C# 类在静态构造函数中创建自身的实例是否安全?,c#,C#,我偶然发现了一个问题,在这个问题中,我需要一个类的实例在它的静态构造函数中。我认为这是不可能的,所以我尝试了以下方法: class Program { static void Main(string[] args) { Console.WriteLine(Foo.someString); Console.ReadLine(); } } class Foo { public static readonly string someSt

我偶然发现了一个问题,在这个问题中,我需要一个类的实例在它的静态构造函数中。我认为这是不可能的,所以我尝试了以下方法:

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";
    }
}
令我惊讶的是,它是有效的——输出是“一些文本”。我认为静态构造函数必须在创建类的实例之前运行并完成。这表明情况未必如此。这是否意味着静态构造函数和实例构造函数彼此独立?最后,这样做安全吗(在静态构造函数中创建实例)?

p、 让我们忽略这样一个事实,即使用不同的方法可以避免这种情况。

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

静态构造函数用于初始化任何静态数据,或 执行只需执行一次的特定操作。信息技术 在创建第一个实例或任何 静态成员被引用


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

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

安全吗?:这样做没有害处。只是他们只被执行一次


有关此项的信息,请阅读它是安全的,因为它只会被调用一次

根据safe的定义、实例化的位置和创建的instance@RuneFS-可以安全地执行与示例中类似的操作-初始化静态成员变量当静态构造函数依赖于其他静态构造函数时要小心。尽量不要获取循环依赖项,因为这会导致您在静态初始值设定项完成运行之前访问类的成员并创建类的实例。框架不会就此向您发出警告(即,没有异常或死锁)。@Ruben-我知道循环依赖性问题。然而,在这种情况下,我有一个干净的情况——它类似于我给出的简化示例。但thanx表示警告。@loodakrawa通常无法回答,因为它取决于CreateString的实现。使用一个安全的常数。如果实现依赖于类的其他静态部分,那么在构造函数中初始化的顺序将成为一个问题。如果你只是实例化并调用一个实例方法,或者把它作为最后一件事来做,那么很有可能它是安全的,但也有可能是(故意的)一个非常奇怪的事情在CLR/C的未来版本中被忽略,如果它妨碍了更重要的事情,则在第一次访问类型(成员)时调用所有静态构造函数中的第一个,而不是在加载包含该类型的程序集时调用。其次,当在上面调用静态构造函数时,会创建一个实例,这就是OP所要求的关于是否安全的问题。所以,即使关于何时调用构造函数的语句确实发生了变化,OP在那个特定的时间实例化,我也不知道谁是downvoter,但您的语句“当应用程序加载到内存中时调用静态构造函数”不是真的。我没有downvote,但我想这是因为这个短语“当应用程序加载到内存中时”。这不是真的:它在您开始使用类之前及时运行(每个框架版本的确切语义不同)。如果您不以任何方式使用该类,则永远不会调用静态初始值设定项。有时甚至在您使用类时也不会调用它(例如,当您对未访问类的静态字段的类调用静态方法时;同样,每个框架版本的确切行为有所不同)@Ruben我从MSDN获得的上述信息..我已经dv'ed并立即发布了评论,这是我所能做的最起码的事情。但是他们没有立即发布。我已经删除了dv。因为声明已经更正