Разрешает ли C # зависимость между статическими членами данных автоматически? - PullRequest
9 голосов
/ 13 ноября 2009

Если один элемент статических данных зависит от другого элемента статических данных, гарантирует ли C # / .NET, что зависимый статический элемент инициализируется перед зависимым элементом?

Например, у нас есть один класс, например:

class Foo
{
    public static string a = "abc";

    public static string b = Foo.a + "def";
}

Когда происходит доступ к Foo.b , это всегда "abcdef" или может быть "def"?

Если это не гарантировано, есть ли лучший способ убедиться, что зависимый элемент инициализирован первым?

Ответы [ 2 ]

9 голосов
/ 13 ноября 2009

Как сказано выше, инициализация статического поля является детерминированной и происходит в соответствии с порядком текстовой декларации.

Возьмите это, например:

class Foo
{
    public static string b = a + "def";
    public static string a = "abc";
}

Foo.b всегда будет приводить к "def".

В этом отношении, когда существует зависимость между статическими полями, лучше использовать статический инициализатор:

class Foo
{
    public static string b;
    public static string a;

    static Foo()
    {
        a = "abc";
        b = a + "def";
    }
}

Таким образом, вы явно выражаете беспокойство по поводу порядка инициализации; или зависимость в этом отношении (даже если компилятор не поможет, если вы случайно поменяете местами операторы инициализации.) Вышеуказанные значения будут храниться в a и b (соответственно «abc» и «abcdef»).

Однако при инициализации статических полей, определенных в нескольких классах, могут возникнуть сложности (и специфичные для реализации). Раздел 10.4.5.1 Инициализация статического поля спецификации языка еще немного об этом говорит.

2 голосов
/ 13 ноября 2009

Он всегда будет показывать «abcdef», потому что инициализация идет сверху вниз в источнике, сегодня, как и раньше.

Все статические элементы будут инициализированы при загрузке класса, содержащего их.

...