это - static initialization c#




Зависит ли C#от зависимостей между статическими элементами данных автоматически? (2)

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

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

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


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

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





data-members