可能重复:
Why doesn't the CLR always call value type constructors
在里希特的书中找到了下一个代码(我已经简化了一点):
internal struct SomeValType
{
static SomeValType()
{
Console.WriteLine("This never gets displayed");
}
public Int32 X;
}
public sealed class Program
{
public static void Main()
{
SomeValType a = new SomeValType { X = 123 };
Console.WriteLine(a.X);
}
}
输出:
123
无法理解静态构造函数nevel调用中WriteLine
的原因。看看ILDasm - 构造函数代码和方法调用存在。如果我向SomeValType
添加任何静态变量并在构造函数中初始化它,然后WriteLine
正确调用。
有人可以解释一下这种情况下的行为吗?感谢。
答案 0 :(得分:1)
可能是因为您永远不会访问真正的构造函数或静态字段。
值类型的默认构造函数是特殊的。它只是初始化二进制所有字段的默认值(即二进制零整个结构)
答案 1 :(得分:1)
来自MSDN:
似乎单词class是这里的关键。如上所述,在创建类型的第一个实例时,使SomeValType成为类会导致静态构造函数调用。但是,当它是结构时,您似乎需要访问静态字段或调用静态方法来触发此行为。这是一个错误还是有意?