14

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

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

+0

это тот же вопрос, как HTTP://stackoverflow.com/questions/2656548/ioc-container-handling-state-params-in-non-default-constructor? Если да, то это намного яснее и точнее, но если это не так, возможно, вам стоит подчеркнуть, что в этом отличается ... –

ответ

9

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

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

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

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

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

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

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

+0

Согласен, больше поддержки неизменяемых типов в C# было бы здорово. – Steven

+0

Hip Hip Hooray для названных аргументов и дополнительных параметров! Две из немногих возможностей VB, которые я пропустил с тех пор, как прыгали с корабля. –

+0

@Jon: Фактически «настройка свойств после инициализатора объекта» меня не тревожит, так как клиент несет ответственность за нарушение условий, связанных с каждым свойством. Я просто хочу избежать ситуации, когда я практически не могу предоставить инвариант, потому что инициализаторы объектов и кодовые контракты не ладят друг с другом. Похоже, что жюри отсутствует на объектных инициаторах, хотя, как вы говорите, «кодовые контракты * могут * сделать вызов инварианту, когда завершаются инициализаторы объектов». Но, скорее всего, дополнительные опции/параметры по умолчанию будут хорошо работать с кодовыми контрактами. –