Автоматически разрешает ли C# зависимости среди статических членов данных?
-
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», потому что инициализация выйдет вниз в источнике, сегодня, как и раньше.
Все статические участники будут инициализированы при загрузке клавиши, держащего их.