По номиналу казалось бы, что объектные инициализаторы представляют проблему для .net 4.0 "контракты кода", где обычно инвариант должен быть установлен к тому времени, когда конструктор Object закончен. По-видимому, однако, объектные инициализаторы требуют, чтобы свойства были установлены после того, как конструкция будет завершена.
Мой вопрос состоит в том, если инварианты "контрактов кода" могут обработать объектные инициализаторы, "как будто" свойства были установлены, прежде чем конструктор завершается? Это было бы очень хорошо действительно!!
Ну, я полагаю, Контракты кода могут вставить дополнительный вызов инварианта в конец инициализатора объекта - если он может сказать, что он используется . (Не забывайте, что он в основном использует IL, а не исходный код; насколько мне известно, исходный код используется только для генерации сообщений об ошибках.)
Это кажется мне плохим дизайном, хотя - поощряется неудачная природа инициализаторов объектов. Что бы вы сделали с установкой свойств после инициализатора объекта? Они могли снова сделать объект недействительным.
Похоже, вы в основном хотите, чтобы по крайней мере некоторые свойства были неизменными, но вам нужна простота инициализаторов объектов.Именованные аргументы и необязательные параметры в C # 4 дают вам кое-что из этого - создайте конструктор со всеми соответствующими свойствами (и значениями по умолчанию), затем вы можете вызвать его следующим образом:
Person person = new Person(firstName: "Jon", lastName: "Skeet");
Это недалеко от синтаксиса инициализатора объекта:
Person person = new Person { FirstName = "Jon", LastName = "Skeet" };
Это не идеально, и я бы хотел, чтобы в C # была больше поддержки неизменяемых типов (как для создания, так и для использования), но это начало ...