C# 中关于静态构造函数的文档说:
静态构造函数用于初始化任何静态数据,或执行只需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前自动调用它。
最后一部分(关于它何时被自动调用)让我陷入了循环;在阅读那部分之前,我认为通过简单地以任何方式访问一个类,我可以确定它的基类的静态构造函数已被调用。测试和检查文档表明情况并非如此;似乎在专门访问该基类的成员之前,不能保证基类的静态构造函数运行。
现在,我想在大多数情况下,当您处理派生类时,您会构造一个实例,这将构成正在创建的基类的实例,因此将调用静态构造函数。但是如果我只处理派生类的静态成员,那又如何呢?
为了更具体一点,我认为下面的代码可以工作:
abstract class TypeBase
{
static TypeBase()
{
Type<int>.Name = "int";
Type<long>.Name = "long";
Type<double>.Name = "double";
}
}
class Type<T> : TypeBase
{
public static string Name { get; internal set; }
}
class Program
{
Console.WriteLine(Type<int>.Name);
}
我假设访问Type<T>
该类会自动调用静态构造函数TypeBase
;但情况似乎并非如此。Type<int>.Name
是null
,上面的代码输出空字符串。
除了创建一些虚拟成员(如Initialize()
什么都不做的静态方法)之外,还有更好的方法来确保在使用任何派生类型之前调用基类型的静态构造函数吗?
如果不是,那么......它是虚拟成员!