C #: переменная статического объекта в классе - PullRequest
4 голосов
/ 24 декабря 2010

Если у меня есть статическая переменная в классе:

public class MyClass {
    private static MyObject = new MyObject();
    public void MyMethod() {
        // do some stuff
    }
}

Можно ли создать экземпляр переменной при объявлении, как указано выше?

Ответы [ 3 ]

6 голосов
/ 24 декабря 2010

Ваш код легален и работает.

Следует помнить, что статические конструкторы и инициализаторы не запускаются при загрузке модуля, а только при необходимости.
MyObject будет создаваться только тогда, когда вы создаете экземпляр MyClass или обращаетесь к его статическому полю.

10.5.5.1 Инициализация статического поля
Инициализаторы переменных статического поля класса соответствуют последовательности назначений, которые выполняются в текстовом порядке, в котором они появляются в объявлении класса. Если в классе существует статический конструктор (§10.12), выполнение инициализаторов статического поля происходит непосредственно перед выполнением этого статического конструктора. В противном случае инициализаторы статического поля выполняются во время, зависящее от реализации, до первого использования статического поля этого класса.

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

Итак, насколько я понимаю:

  • Если статический конструктор отсутствует, вызов статического метода может вызвать инициализаторы, но это не требуется, если статический метод не использует статическое поле.
  • Если есть статический конструктор, он должен запускаться при обращении к статическому члену, поэтому вызов статического метода запускает сначала инициализаторы статического поля, а затем статический конструктор.
4 голосов
/ 24 декабря 2010

Да.Обратите внимание на две конкретные вещи:

  1. Статические переменные будут инициализированы в порядке их появления в классе.
  2. Они гарантированно будут инициализированы до вызова любого статического конструктора.

В разделе 10.5.5.1 C # spec более подробно рассматривается интересующая вас информация.

1 голос
/ 24 декабря 2010

Если вы спрашиваете, является ли это законным C #, то да, это так.И он будет делать то, что вы думаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...