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
为空,并且上述代码输出空字符串。
除了创建一些虚拟成员(比如一个什么都不做的静态 Initialize()
方法),是否有更好的方法确保基类的静态构造函数在使用任何派生类型之前被调用?
如果没有,那就只能用虚拟成员!
public static string Name { get { return typeof(T).Name; } }
吗? - Matt Greer