Контракты кода по сравнению с объектными инициализаторами (.net 4.0)

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

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

14
задан Steven 2 May 2010 в 10:41
поделиться

1 ответ

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

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

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

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

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

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

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

9
ответ дан 1 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: