Синтаксис инициализатора вложенных объектов

Resharper только что предложил мне следующий рефакторинг:

// Constructor initializes InitializedProperty but
// the UninitializedSubproperty is uninitialized.
var myInstance = new MyClass();
myInstance.InitializedProperty.UninitializedSubproperty = new MyOtherClass();

// becomes

var myInstance = new MyClass
    {
        InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }
    };

Я никогда раньше не видел такого рода инициализации объекта. В частности, я не вижу, как

InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }

имеет смысл - это не назначение ничего InitializedProperty.

это поведение указано где-нибудь?

1 ответов


этот синтаксис называется Объект Инициализации. Спецификация C# явно дает много примеров по этому вопросу:

7.6.10.2 инициализаторы объектов

инициализатор объекта состоит из последовательности инициализаторов элементов, заключенной в { и } токены и разделены запятыми. Каждый инициализатор элемента должен доступное поле или свойство инициализируемого объекта, за которым следует по знаку равенства и выражению или объекту инициализатор или инициализатор коллекции. Это ошибка для инициализатора объекта включить более одного инициализатора элемента для одного поля или свойство. Инициализатор объекта не может ссылаться на вновь созданный объект инициализируется.

пример:

Rectangle r = new Rectangle
            {
                P1 = { X = 0, Y = 1 },
                P2 = { X = 2, Y = 3 }
            };

компилируется до:

Rectangle r = new Rectangle();
r.P1.X = 0;
r.P1.Y = 1;
r.P2.X = 2;
r.P2.Y = 3;

наличие:

public class Rectangle
{
    public Rectangle()
    {
        P1 = new Point(); //default Point for demo purpose
        P2 = new Point(); //default Point for demo purpose
    }

    public Point P1 { get; set; }
    public Point P2 { get; set; }
}

и

public class Point
{
    public int X { get; set; }
    public int Y { get; set; }
}

также подумайте о чтении большой главы 8.3 Упрощенная инициализация на C# в глубину книги. Джон Скит дает еще один взгляд на преимущества использования такого синтаксиса для инициализации древовидных структур.