Кодекс Контракты Vs. Инициализаторы объектов (.net 4.0) - PullRequest
14 голосов
/ 02 мая 2010

На первый взгляд может показаться, что инициализаторы объектов представляют проблему для «контрактов кода» .net 4.0, где обычно инвариант должен быть установлен к моменту завершения конструктора объекта. Предположительно, однако, объектные инициализаторы требуют, чтобы свойства были установлены после завершения построения.

Мой вопрос заключается в том, способны ли инварианты «контрактов кода» обрабатывать инициализаторы объектов, «как если бы» свойства были установлены до завершения конструктора? Это было бы очень приятно на самом деле !!

1 Ответ

9 голосов
/ 02 мая 2010

Ну, я полагаю, кодовые контракты могли бы вставить дополнительный вызов инварианта в конце инициализатора объекта - если бы он мог сказать, что это используется. (Не забывайте, что он в основном использует IL, а не исходный код; насколько я знаю, исходный код используется только для генерации сообщений об ошибках.)

Это кажется мне плохим дизайном - обнадеживает неудачная природа инициализаторов объектов. Что бы вы сделали с настройкой свойств после инициализатора объекта? Они могут снова сделать объект недействительным.

Звучит так, будто вы хотите, чтобы по крайней мере некоторые свойства были неизменяемыми, но вы хотите воспользоваться простотой инициализаторов объектов. Именованные аргументы и необязательные параметры в C # 4 дают вам кое-что из этого - создайте конструктор со всеми соответствующими свойствами (и значениями по умолчанию), затем вы можете вызвать его так:

Person person = new Person(firstName: "Jon", lastName: "Skeet");

Это не далеко от синтаксиса инициализатора объекта:

Person person = new Person { FirstName = "Jon", LastName = "Skeet" };

Это не идеально, и я бы хотел, чтобы в C # была больше поддержки неизменяемых типов (как создание, так и использование), но это начало ...

...