如何在C#中初始化静态

she*_*mus 4 c# static initialization

好的,我已经大大改变了代码,以更清楚地显示实际问题.我已经测试了这段代码,它肯定会失败.

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

以下代码失败,因为在调用ValueOf()之前从不调用Colors构造函数.在调用ValueOf之前,是否有一种干净的方法可以确保调用所有静态字段?

谢谢,~S

Dmi*_*try 5

静态字段在使用之前会初始化.确切的时间取决于实施,你不应该对它做任何假设.静态字段初始化:

类的静态字段变量初始值设定项对应于以它们出现在类声明中的文本顺序执行的赋值序列.如果类中存在静态构造函数(第10.11节),则在执行该静态构造函数之前立即执行静态字段初始值设定项.否则,静态字段初始化器在第一次使用该类的静态字段之前实现相关时间执行.

您发布的代码应该有效:

Child.TimesConstructed()
Run Code Online (Sandbox Code Playgroud)

如果您Child.C1在此呼叫之前访问其中一个子(),则不会打印0 .