Ответ 1
На самом деле, возможно, очень немного медленнее использовать инициализатор объекта, чем вызвать конструктор, а затем назначить свойства, так как он имеет одно дополнительное назначение:
MyClass foo = new MyClass();
foo.Property1 = 4;
foo.Property2 = "garfield";
против
MyClass tmp = new MyClass();
tmp.Property1 = 4;
tmp.Property2 = "garfield";
MyClass foo = tmp;
Все свойства назначаются до того, как ссылка будет назначена переменной. Это различие является видимым, если оно повторно использует переменную:
using System;
public class Test
{
static Test shared;
string First { get; set; }
string Second
{
set
{
Console.WriteLine("Setting second. shared.First={0}",
shared == null ? "n/a" : shared.First);
}
}
static void Main()
{
shared = new Test { First = "First 1", Second = "Second 1" };
shared = new Test { First = "First 2", Second = "Second 2" };
}
}
Результат показывает, что во второй строке Main
, когда Second
устанавливается (после First
), значение shared.First
по-прежнему остается "первым 1" - т.е. shared
не имеет было присвоено новое значение.
Как говорит Марк, вы почти наверняка никогда не заметите разницу.
Анонимные типы гарантируют использование конструктора - форма указана в разделе 7.5.10.6 спецификации языка С# 3.