В 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;
Другие вопросы по тегам