以下代码不会调用类静态构造函数。这是一个错误或功能吗?
class Test
{
static Test
{
//do stuff
}
public static AnotherClass ClassInstance { get; set; }
}
class Program
{
public static void Main()
{
var x = Test.ClassInstance;
}
}
我现在没有编译器,但这就是我今天发生的事情。永远不会调用静态构造函数,但是当ClassInstance是一个字段时调用它。
编辑: 我知道在创建第一个实例或访问字段时会调用静态构造函数。自动实现的属性背后是否有一个字段?
我正在寻找一些解释,当属性实现为两个函数和一个字段时,属性为什么不触发静态构造函数。这对我来说非常不合逻辑,这就是为什么我认为它可能是一个错误。
答案 0 :(得分:1)
静态构造函数在第一次创建类的实例或引用静态成员时调用。因此,第一次创建Test实例或引用ClassInstance属性时,将调用静态构造函数。
您想了解更多吗? - http://msdn.microsoft.com/en-us/library/k9x6w0hc(VS.80).aspx
答案 1 :(得分:1)
在访问任何静态成员或创建实例时调用静态构造函数
class Program
{
static void Main(string[] args)
{
A.SomeField = new B();
}
}
class A
{
static A()
{
Console.WriteLine("Static A");
}
public static B SomeField { get; set; }
}
class B
{
static B()
{
Console.WriteLine("Static B");
}
}
结果:
Static B
Static A
如您所见 - 结果中没有“静态B”
答案 2 :(得分:1)
我验证了相同的行为,但是如果您更改这样的代码:
class AnotherClass {}
class Test
{
static Test()
{
Console.WriteLine("Hello, world!");
}
public static AnotherClass ClassInstance { get { return new AnotherClass(); } }
}
class Program
{
public static void Main()
{
var x = Test.ClassInstance;
}
}
它写道“你好,世界!”......
答案 3 :(得分:0)
在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数。
来自Msdn.
的更多信息