Вы должны спросить себя, должен ли ваш тип быть изменчивым или нет. Лично мне нравятся неизменяемые типы - они позволяют легче рассуждать о том, что происходит, легче проверять (после вызова конструктора и проверки состояния вы знаете, что он не станет недействительным), и они отлично подходят для параллелизма.
С другой стороны, инициализаторы объектов, безусловно, полезны в тех случаях, когда разумно иметь изменяемые типы. Например, ProcessStartInfo
эффективно используется как тип компоновщика для Process
. Полезно уметь писать:
var info = new ProcessStartInfo {
FileName = "notepad.exe",
Arguments = "foo.txt",
ErrorDialog = true
};
Process process = Process.Start(info);
Действительно, вы можете даже сделать все это встроенным, вместо того, чтобы иметь дополнительную переменную. Порт My Protocol Buffers использует такой же шаблон:
Foo foo = new Foo.Builder {
FirstProperty = "first",
SecondProperty = "second"
}.Build();
Теперь одной альтернативой шаблону компоновщика являются параметры конструктора (возможно, с помощью заводских методов). Исторический недостаток этого заключается в том, что вам требовались разные перегрузки в зависимости от того, какие свойства были установлены, и если несколько параметров имели одинаковый тип, было бы трудно определить, какой из них был каким. C # 4 значительно упрощает использование необязательных параметров и именованных аргументов. Например, если вы создаете класс электронной почты, у вас может быть:
Email email = new Email(
from: "skeet@pobox.com",
to: "jon@example.com",
subject: "Test email",
body: textVariable
);
У этого есть много тех же самых преимуществ инициализаторов объекта с точки зрения ясности, но без потери изменчивости. Вышеупомянутый вызов конструктора мог пропустить некоторые необязательные параметры, такие как вложения и список BCC. Я думаю, что это окажется одним из самых больших преимуществ C # 4 для тех из нас, кто любит неизменность, но также любит ясность инициализаторов объектов.