Как статика инициализируется в C # - PullRequest
4 голосов
/ 24 сентября 2011

Хорошо, я сильно изменил код, чтобы более четко показать реальную проблему.Я проверил этот код, и он определенно не работает.

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));
    }
}

Следующий код завершается ошибкой, потому что конструктор Colors никогда не вызывается до вызова ValueOf ()Есть ли чистый способ убедиться, что все мои статические поля вызываются до того, как я вызову ValueOf?

Спасибо, ~ S

1 Ответ

5 голосов
/ 24 сентября 2011

Статические поля инициализируются перед их использованием.Точное время зависит от реализации, и вы не должны делать никаких предположений по этому поводу. Инициализация статических полей :

Инициализаторы статических переменных поля класса соответствуют последовательности присваиваний, которые выполняются в текстовом порядке, в котором они появляются в объявлении класса.Если в классе существует статический конструктор (раздел 10.11), выполнение инициализаторов статического поля происходит непосредственно перед выполнением этого статического конструктора.В противном случае инициализаторы статического поля выполняются в зависящее от реализации время до первого использования статического поля этого класса .

Код, который вы опубликовали, должен работать:

Child.TimesConstructed()

не будет печатать 0, если вы обращаетесь к одному из детей (Child.C1) до этого вызова.

...