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

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

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


person Brent Arias    schedule 02.05.2010    source источник
comment
Это тот же вопрос, что и stackoverflow.com/questions/2656548/? Если это так, это намного яснее и по делу, но если это не так, возможно, вам стоит подчеркнуть, что отличается в этом ...   -  person Pascal Cuoq    schedule 02.05.2010


Ответы (1)


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

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

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

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

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

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

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

person Jon Skeet    schedule 02.05.2010
comment
Я согласен, было бы здорово больше поддерживать неизменяемые типы в C #. - person Steven; 02.05.2010
comment
Hip Hip Ура за именованные аргументы и необязательные параметры! Две из небольшой горстки функций VB, которые я упустил с тех пор, как покинул корабль. - person Sky Sanders; 02.05.2010
comment
@Jon: На самом деле установка свойств после инициализатора объекта меня не тревожит, поскольку клиент отвечает за то, чтобы не нарушать предварительное условие, связанное с каждым свойством. Я просто хочу избежать ситуации, когда я практически не могу предоставить инвариант, потому что инициализаторы объектов и контракты кода не ладят друг с другом. Похоже, что к инициаторам объектов жюри еще не пришло, поскольку, как вы говорите, контракты кода могут вызывать инвариант после завершения инициализации объекта. Но кажется более вероятным, что необязательные параметры / параметры по умолчанию будут хорошо работать с контрактами кода. - person Brent Arias; 02.05.2010
comment
@Brent: Немного поздно, но: инициализатор объекта - это синтаксический сахар для конструктора, за которым следует установка некоторых свойств. После регулярной установки свойства инварианты не проверяются, поскольку предварительные условия свойства должны обрабатывать любой искажающий ввод. Если у вас есть это в виду, выбор отказа от проверки инвариантов после инициализатора объекта более понятен или даже уместен. - person JBSnorro; 19.08.2011