我不确定为什么会这样,但据我推测(在Skeet的帮助下)如果我有一个静态类
public static class Statics1
{
public static string Value1 { get; set; }
static Statics1()
{
Console.WriteLine("Statics1 cctor");
Value1 = "Initialized 1";
}
}
编码:
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null);
or
staticType.TypeInitializer.Invoke(new object[0]);
将抛出异常,因为这会以某种方式解析为 .ctor,而不是类的 .cctor。
如果我使用显式静态类,它被视为抽象密封类,所以例外是抽象类无法实例化,如果我使用带有静态构造函数的常规类,则例外是类型初始化器不是可调用的。
但是,如果我使用带有两个参数(实例、参数)的 Invoke 重载,如下所示:
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null, null);
明确说明我正在调用一个静态方法(这是第一个 null 的含义 - 没有实例 == 静态),这可以正常工作并初始化类。
也就是说,静态构造函数是奇怪的野兽。以这种方式调用一个将调用静态构造函数,即使它已经被执行,即这个代码:
Console.WriteLine(Statics1.Value1);
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null, null);
将调用静态构造函数两次。因此,如果您的 cctor 具有潜在的重要副作用,例如创建文件、打开数据库等,您可能需要重新考虑这种方法。
此外,尽管出于可读性的原因我更喜欢静态构造函数,但从性能的角度来看,字段初始值设定项比静态构造函数快一点