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