如何在C#中初始化统计信息

时间:2011-09-23 23:44:16

标签: 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));
    }
}

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

谢谢, 382 4

1 个答案:

答案 0 :(得分:5)

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

  

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

您发布的代码应该有效:

Child.TimesConstructed()
如果您在此次通话前访问其中一个孩子(Child.C1),

将不会打印0。