В C#, синтаксис инициализации объекта происходит перед присваиванием?
В C# выполняет инициализацию объекта следующим образом:
var thing = new List<object>() {new object()};
Происходит перед назначением, так что это примерно так же, как:
var _thing = new List<object>();
_thing.Add(new object());
var thing = _thing;
Или это происходит после назначения, так что это примерно так же, как:
var thing = new List<object>();
thing.Add(new object());
Это имело бы значение, если вы пытаетесь связать рекурсивный узел на фабрике, такой как:
static class AbstractFactory {
private static readonly IEnumerable<object> _list = new List<object>() {GetIEnumerable()};
public static IEnumerable<object> GetIEnumerable() {
return _list;
}
}
когда _list
возвращается из GetIEnumerable
когда метод вызывается в инициализаторе для _list
это будет new List<object>
, null
или не определено?
1 ответ
Решение
Компилируется до первого примера, т.е. object initialization occurs before assignment
,
Вы можете посмотреть на скомпилированную версию, используя .Net Reflector. Это скомпилировано до этого (извлечено с использованием отражателя) -
List<object> <>g__initLocal0 = new List<object>();
<>g__initLocal0.Add(new object());
List<object> thing = <>g__initLocal0;