Автоматически разрешает ли C# зависимости среди статических членов данных?

StackOverflow https://stackoverflow.com/questions/1727301

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Когда Foo.b Доступ, всегда ли это «Abcdef» или может быть «def»?

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

Это было полезно?

Решение

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

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

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 Инициализация статического поля о спецификации языка рассказывает об этом еще немного.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top