14

En su valor nominal, parecería que los inicializadores de objetos presentan un problema para .net 4.0 "contratos de código", donde normalmente el invariante debe establecerse para cuando el constructor de objetos finalice. Es de suponer, sin embargo, que los inicializadores de objetos requieren que se establezcan las propiedades una vez completada la construcción.Contratos de código vs. Inicializadores de objetos (.net 4.0)

Mi pregunta es si las invariantes de los "contratos de código" son capaces de manejar los inicializadores de objetos, "como si" las propiedades se establecieron antes de que el constructor finalice? Eso sería muy bueno!

+0

es esta la misma pregunta que http://stackoverflow.com/questions/2656548/ioc-container-handling-state-params-in-non-default-constructor? Si es así, es mucho más claro y directo, pero si no lo es, quizás deberías enfatizar qué es diferente en este ... –

Respuesta

9

Bueno, supongo que Code Contracts podría insertar una llamada adicional a un invariante al final del inicializador de objetos, si pudiera decir que se estaba utilizando. (No olvide que utiliza principalmente el código IL en lugar del código fuente, hasta donde yo sé, el código fuente solo se usa para generar mensajes de error.)

Esto me parece un diseño deficiente, aunque alentado por la naturaleza desafortunada de los inicializadores de objetos. ¿Qué haría al configurar las propiedades después de el inicializador de objetos? Podrían volver el objeto inválido.

Parece que básicamente quiere que al menos algunas propiedades sean inmutables, pero desea el beneficio de la simplicidad de los inicializadores de objetos. Los argumentos con nombre y parámetros opcionales en C# 4 le dan algo de esto - crear un constructor con todas las propiedades adecuadas (y valores predeterminados), entonces se le puede llamar así:

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

Esto no está lejos del objeto sintaxis de inicializador:

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

no es lo ideal, y deseo C# tenía más apoyo a los tipos inmutables (tanto la creación y uso), pero es un comienzo ...

+0

Estoy de acuerdo, más soporte para tipos inmutables en C# sería genial. – Steven

+0

Hip Hip Hooray para argumentos con nombre y parámetros opcionales! Dos de las pocas características de VB que he echado de menos desde que salí del barco. –

+0

@Jon: en realidad "establecer propiedades después del inicializador de objetos" no me alarma, ya que el cliente es responsable de no romper la condición previa asociada con cada propiedad. Solo quiero evitar una situación en la que prácticamente no puedo suministrar un invariante, porque los inicializadores de objetos y los contratos de código no se llevan bien. Sin embargo, parece que el jurado no está interesado en los iniciadores de objetos, ya que dice que "los contratos de código * podrían * hacer una llamada a un invariante cuando se completen los inicializadores de objetos". Pero parece más probable que los parámetros opcionales/predeterminados funcionen bien con los contratos de código –

Cuestiones relacionadas