以下程序的输出为:
Non-Static
Static
Non-Static这是一个编译器错误吗?我期望:
Static
Non-Static
Non-Static因为我认为静态构造函数总是在非静态构造函数之前调用。
我在使用.net 3.5和.net 4.0的Visual Studio2010中测试了这一点。
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();
}
}发布于 2010-05-28 07:10:02
参见ECMA 334§17.4.5.1:
17.4.5.1静态字段初始化
类声明的静态字段变量初始值设定项对应于一系列赋值,这些赋值是按照它们在类声明中出现的文本顺序执行的。如果类中存在静态构造函数(§17.11),则在执行该静态构造函数之前立即执行静态字段初始化器。否则,静态字段初始化器在首次使用该类的静态字段之前的依赖于实现的时间执行
具体地说:“静态字段初始化器的执行发生在执行该静态构造函数之前”。
您的static MyClass aVar必须在静态构造函数执行之前初始化(或者,至少它必须以这种方式出现)。如果没有该静态成员,则应在调用任何非静态构造函数之前调用该静态构造函数。
如果你仍然想要一个MyClass单例,你可以将它放在一个容器类中,并使用它来引用它,例如:
public static class MyClassSingleton
{
public static MyClass aVar = new MyClass();
}发布于 2010-05-28 07:12:29
这是由线路public static MyClass aVar = new MyClass();引起的。
实际上,aVar = new MyClass();是静态构造函数的前缀。所以你的静态构造函数:
static MyClass() {
Console.WriteLine("Static");
}更改为:
static MyClass() {
aVar = new MyClass(); // this will run instance contstructor and prints "Non-Static"
Console.WriteLine("Static");
}发布于 2010-05-28 07:03:27
此public static MyClass aVar = new MyClass();是静态构造函数的一部分。如果你用反光镜观察它,你会看到以下内容:
static MyClass()
{
aVar = new Program.MyClass();
Console.WriteLine("Static");
}所以你的结果现在应该很明显了。
https://stackoverflow.com/questions/2925611
复制相似问题