Когда запускаются статические объявления? - PullRequest
0 голосов
/ 22 декабря 2009

Вот кусок моего кода:

public class MyClass {
  public object Value { get; set; }

  public MyClass(object value) {
    this.Value = value;
  }
}

public class AnotherClass {
  private static MyClass _MyObj = new MyClass(new object());

  public static void Main(string[] args) {
    var x = _MyObj; // no problem
    var y = x.Value; // no problem
    var z = y.ToString(); // Null ref exception
  }
}

Я не понимаю, как это может быть. _MyObj не является нулевым, что означает, что встроенное присваивание работало, но _MyObj.Value выходит нулевым, что означает, что код конструктора не был вызван! Здесь работает какая-то темная магия, и я был бы очень признателен за объяснение.

Спасибо!

РЕДАКТИРОВАТЬ - извините за отсутствие воспроизведения. Мой реальный код (очевидно) более сложен, чем этот, поэтому я попытался обдумать его, и, очевидно, в процессе я должен был удалить некоторые другие препятствия для правильной функции кода. Но Ответ Коби - это действительно то, что я пытался выбрать из этого вопроса, так или иначе - так что ответьте ему должное. :)

Ответы [ 3 ]

2 голосов
/ 22 декабря 2009

Статус: нет воспроизведения.

Приведенный пример кода не компилируется, public object Value { get; } не является допустимым автоматическим свойством.

После исправления с private set; он компилируется и запускается без ошибки.

2 голосов
/ 22 декабря 2009

Правильный способ инициализации статических элементов - использование статического конструктора :

static AnotherClass(){
  _MyObj = new MyClass(new object());
}
1 голос
/ 22 декабря 2009

Поставь сеттер и он будет работать как положено:

public object Value { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...