好的,我已经大大改变了代码,以更清楚地显示实际问题。我已经测试了这段代码,但肯定会失败。
public class MyEnumBase
{
private int _val;
private static Dictionary<int, MyEnumBase> ValueMap = new Dictionary<int, MyEnumBase>();
protected MyEnumBase()
{
_val = ValueMap.Count;
ValueMap.Add(_val, this);
}
public static MyEnumBase ValueOf(int i)
{
return ValueMap[i];
}
public static IEnumerable<MyEnumBase> Values { get { return ValueMap.Values; } }
public override string ToString()
{
return string.Format("MyEnum({0})", _val);
}
}
public class Colors : MyEnumBase
{
public static readonly Colors Red = new Colors();
public static readonly Colors Green = new Colors();
public static readonly Colors Blue = new Colors();
public static readonly Colors Yellow = new Colors();
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("color value of 1 is " + Colors.ValueOf(2));
}
}
以下代码失败,因为在调用ValueOf()之前从不调用Colors构造函数。有没有一种干净的方法来确保在调用ValueOf之前调用所有静态字段?
谢谢, 382 4
答案 0 :(得分:5)
静态字段在使用之前会被初始化。确切的时间取决于实施,你不应该对它做任何假设。 Static fields initialization:
类的静态字段变量初始值设定项对应于a 以文本顺序执行的分配顺序 它们出现在类声明中。如果是静态构造函数 (第10.11节)存在于类中,执行静态字段 初始化程序在执行该静态之前立即发生 构造函数。否则,执行静态字段初始值设定项 在第一次使用静态之前的与实现相关的时间 该类的领域。
您发布的代码应该有效:
Child.TimesConstructed()
如果您在此次通话前访问其中一个孩子(Child.C1
),将不会打印0。