Frage

In c#, does an object initialization like:

var thing = new List<object>() {new object()};

Occur before the assignment, so that it's approximately the same as:

var _thing = new List<object>();
_thing.Add(new object());
var thing = _thing;

Or does it occur after the assignment, so that it's approximately the same as:

var thing = new List<object>();
thing.Add(new object());

This would make a difference if you are trying to tie a recursive knot in a factory like:

static class AbstractFactory {
    private static readonly IEnumerable<object> _list = new List<object>() {GetIEnumerable()};

    public static IEnumerable<object> GetIEnumerable() {
        return _list;
    }
}

When _list is returned from GetIEnumerable when the method is called in the initializer for _list, will it be the new List<object>, null, or undefined?

War es hilfreich?

Lösung

It compiles down to first example i.e. object initialization occurs before assignment.

You can look at the compiled version using .Net Reflector. It compiled down to this (extracted using reflector) -

List<object> <>g__initLocal0 = new List<object>();
<>g__initLocal0.Add(new object());
List<object> thing = <>g__initLocal0;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top