Подтвердить что ты не робот

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

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.

Это поведение указано где угодно?

4b9b3361

Ответ 1

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

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

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

Примеры:

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 Упрощенная инициализация в книге С# в глубину. Jon Skeet предлагает еще один взгляд на преимущества использования такого синтаксиса для инициализации древовидных структур.