Подтвердить что ты не робот

Статическое поле С#, конструктор экземпляра

Я столкнулся с поведением С#, которое я хотел бы понять. Рассмотрим такой класс:

public class SomeSingleton
{
    public static SomeSingleton Default = new SomeSingleton();

    private static int field = 0;

    private SomeSingleton()
    {
        field = 1;
    }

    public int GetField()
    {
        return field;
    }
}

Теперь позвольте вызвать метод GetField():

var field = SomeSingleton.Default.GetField();

Я получаю 0, как если бы конструктор экземпляра был пропущен. Почему?

4b9b3361

Ответ 1

Просто поменяйте порядок объявления field до Default.

Итак, ваши строки:

public static SomeSingleton Default = new SomeSingleton();
private static int field = 0;

должен быть:

private static int field = 0;
public static SomeSingleton Default = new SomeSingleton();

Причина связана с порядком инициализации поля. Первый Default инициализируется в вашем коде, который присваивает значение field 1. Позже этому поле присваивается 0 при инициализации. Следовательно, вы видите последнее значение 0, а не 1.

Смотрите: 10.4.5.1 Инициализация статического поля

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

Ответ 2

Это потому, что упорядочение переменных static. Если вы переключаете два оператора, выход становится 1:

private static int field = 0;

public static SomeSingleton Default = new SomeSingleton();

Это ожидаемое поведение, описанное в MSDN: инициализация статического поля.

Смотрите эту .NET скрипту.

Ответ 3

Переключить порядок статических переменных.

private static int field = 0;
public static SomeSingleton Default = new SomeSingleton();

В вашем коде сначала запускается конструктор, который устанавливает field, а затем field переопределяет его значение.