类型静态构造函数调用

时间:2011-05-01 10:25:25

标签: c# static constructor types

  

可能重复:
  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正确调用。

有人可以解释一下这种情况下的行为吗?感谢。

2 个答案:

答案 0 :(得分:1)

可能是因为您永远不会访问真正的构造函数或静态字段。

值类型的默认构造函数是特殊的。它只是初始化二进制所有字段的默认值(即二进制零整个结构)

答案 1 :(得分:1)

来自MSDN

  • 调用静态构造函数 自动初始化 [强调我的] 在创建第一个实例之前 或引用任何静态成员。

似乎单词class是这里的关键。如上所述,在创建类型的第一个实例时,使SomeValType成为类会导致静态构造函数调用。但是,当它是结构时,您似乎需要访问静态字段或调用静态方法来触发此行为。这是一个错误还是有意?