2009-12-22 4 views
0

Вот часть моего кода:Когда запускаются статические объявления?

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 имеет значение null, что означает, что код конструктора не был вызван! Здесь есть какая-то темная магия, и я очень благодарен за объяснение.

Спасибо!

EDIT - извините за отсутствие репродуцирования. Мой фактический код (очевидно) более сложный, чем этот, поэтому я попытался заглушить его, и, очевидно, в этом процессе я должен удалить некоторые другие препятствия для правильной функции кода. Но Kobi's answer действительно то, что я пытался выбраться из этого вопроса, так или иначе - так ответьте ему. :)

+2

Этот код даже не компилируется, так как у вас нет установщика для свойства Value. –

+0

Какой компилятор? Работает отлично под VS2008/.NET3.5, как только я добавляю сеттер для свойства Value. –

+2

В любом случае, мало что можно добавить к http://stackoverflow.com/questions/1405709/what-is-the-static-variable-initialization-order-in-c – Kobi

ответ

2

Правильный способ инициализации статических членов является использование static constructor:

static AnotherClass(){ 
    _MyObj = new MyClass(new object()); 
} 
+1

Это проблема стиля, ваш код в точности соответствует так же как 'private static MyClass _MyObj = new MyClass (new object());' –

+0

@Henk - Я понимаю это, но он все равно может помочь в более сложном сценарии, как сказал Шауль. – Kobi

1

Помещенный сеттера, и он будет работать, как ожидалось:

public object Value { get; set; } 
2

Статус: Нет репродукция.

Образец образца, как указано, не компилируется, public object Value { get; } не является действительной авто-недвижимостью.

После фиксации с помощью private set; он компилируется и запускается без ошибок.

Смежные вопросы