2

只是一个简单的观察。该属性MethodBase.IsConstructor不适用于static构造函数,并且文档没有提到这一事实(引用:“如果此方法是由对象表示的构造函数,则为trueConstructorInfo ”)。

样本:

static class Program
{
  static void Main()
  {
    ConstructorInfo ci = typeof(Test).GetConstructor(
        BindingFlags.NonPublic | BindingFlags.Static, null, new Type[] { }, null);
    Console.WriteLine(ci is ConstructorInfo); // silly; writes True
    Console.WriteLine(ci.IsConstructor);      // ??     writes False
  }
}

static class Test
{
  static Test()
  {
    Console.WriteLine("I am your static constructor");
  }
}

问:为什么?错误或不完整的规范?

4

1 回答 1

5

“静态构造函数”实际上只是 C# 术语。在 .NET 本身中,有一个类型初始化程序(根据Type.TypeInitializer)。一个类型可以有一个类型初始化器,而无需在 C# 中声明一个静态构造函数——例如用于静态变量初始化。

在源 C# 中有一个静态构造函数有两个效果:

  • 它从类型中删除beforefieldinit标志,可能会改变时间
  • 它将代码添加到类型初始化程序中

因此,虽然它由 a 表示ConstructorInfo,但我对IsConstructor返回 false 并不感到特别惊讶,因为它不是 CLR 术语中的构造函数。它是一个由对象表示的非构造ConstructorInfo函数:) 如果将文档改写为“如果此方法是实例构造函数”,并且如果GetConstructor没有返回它(因为这非常不一致,IMO),那肯定会更清楚。

GetConstructor不可否认的是do 状态的文档:

要使用此方法重载获取类初始值设定项 (.cctor),您必须指定BindingFlags.Static | BindingFlags.NonPublic. 您还可以使用该TypeInitializer属性获取类初始值设定项。

...所以他们没有在那里称它为构造函数。

于 2013-11-14T10:23:35.810 回答