gpt4 book ai didi

c# - 静态构造函数可以在非静态构造函数之后运行。这是编译器错误吗?

转载 作者:可可西里 更新时间:2023-11-01 08:41:02 26 4
gpt4 key购买 nike

以下程序的输出是:

Non-Static
Static
Non-Static

这是编译器错误吗?我预计:

Static
Non-Static
Non-Static

因为我认为静态构造函数总是在非静态构造函数之前被调用。

我使用 .net 3.5 和 .net 4.0 通过 Visual Studio 2010 对此进行了测试。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StaticConstructorBug
{
class Program
{
static void Main(string[] args)
{
var mc = new MyClass();

Console.ReadKey();
}
}

public class MyClass
{
public MyClass()
{
Console.WriteLine("Non-static");
}

static MyClass()
{
Console.WriteLine("Static");
}

public static MyClass aVar = new MyClass();
}
}

最佳答案

参见 ECMA 334 §17.4.5.1:

17.4.5.1 Static field initialization

The static field variable initializers of a class declaration correspond to a sequence of assignments that are executed in the textual order in which they appear in the class declaration. If a static constructor (§17.11) exists in the class, execution of the static field initializers occurs immediately prior to executing that static constructor. Otherwise, the static field initializers are executed at an implementation-dependent time prior to the first use of a static field of that class

具体来说:“静态字段初始值设定项的执行紧接在执行该静态构造函数之前”。

您的static MyClass aVar 必须在您的静态构造函数执行之前初始化(或者,至少,它必须以这种方式出现)。如果没有该静态成员,静态构造函数应该在任何非静态构造函数之前被调用。

如果你仍然想要一个 MyClass 单例,你可以把它放在一个容器类中并使用它来引用它,例如:

public static class MyClassSingleton
{
public static MyClass aVar = new MyClass();
}

关于c# - 静态构造函数可以在非静态构造函数之后运行。这是编译器错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2925611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com