Статическое поле С#, конструктор экземпляра
Я столкнулся с поведением С#, которое я хотел бы понять. Рассмотрим такой класс:
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
, как если бы конструктор экземпляра был пропущен. Почему?
Ответы
Ответ 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
переопределяет его значение.