una tag que programacion new metodos metodo instanciar inicializador ejemplos crear como clases clase c# object-initializers

c# - tag - que es un inicializador en programacion



c#complejidad del inicializador de objetos. mejores prácticas (3)

Estaba demasiado emocionado cuando apareció el inicializador de objetos en C #.

MyClass a = new MyClass(); a.Field1 = Value1; a.Field2 = Value2;

Se puede reescribir más corto:

MyClass a = new MyClass { Field1 = Value1, Field2 = Value2 }

El código de inicialización del objeto es más obvio, pero cuando el número de propiedades llega a la docena y parte de la asignación se relaciona con valores anulables, es difícil depurar dónde está el "error de referencia nulo". Studio muestra todo el inicializador de objetos como punto de error.

Hoy en día utilizo el inicializador de objetos para una asignación directa solo para propiedades sin errores.

¿Cómo usa el inicializador de objetos para la asignación compleja o es una mala práctica usar una docena de asigimientos?

¡Gracias de antemano!


Bueno, mi principal problema con los inicializadores de objetos es que requieren un tipo mutable para comenzar: cuando sea posible, prefiero usar tipos inmutables. Dicho esto, cuando funciona un inicializador de objetos (por ejemplo, para los controles de UI) tiendo a usarlos.

Posiblemente me lo pensaría dos veces si los valores de las asignaciones fueran particularmente complicados de calcular, en particular, tiene que ser capaz de obtener el valor en una sola expresión , y eso puede terminar siendo menos legible que computarlo sobre varias declaraciones . .pero eso es relativamente raro en situaciones donde es posible comenzar con esto.

No puedo decir que haya tenido problemas con las excepciones durante las asignaciones de propiedades con inicializadores de objetos, simplemente no es algo que se me ocurra. Si lo hiciera, probablemente intentaría escribir una prueba de unidad fallida de todos modos, en cuyo punto el código generalmente se vuelve fácil de arreglar sin el depurador de todos modos.

Obviamente, la moderación siempre es algo bueno, no estoy sugiriendo llevar esto al extremo ... pero si está configurando una docena de propiedades, usar un inicializador de objetos no sería tan preocupante para mí como tener una docena de propiedades para configurar para empezar con. ¿Alguna de estas docenas de propiedades están relacionadas? ¿Deberían encapsularse de alguna manera? (En algunos casos, está bien, de nuevo, especialmente con los controles de UI, pero a menudo no lo está).


Nunca lo uso en el código que está en desarrollo porque, como usted señala, es más difícil de depurar.

Para el código que está bien probado, puede hacer que el código sea más legible, aunque se podría argumentar que no debería jugar con un código bien probado y de trabajo solo para que sea más fácil de leer.

Recuerde, los inicializadores de objetos se introdujeron en el lenguaje principalmente para hacer que la sintaxis de Linq fuera legal. Eso no significa que deba ser usado más ampliamente.

Dicho esto, si está configurando un grupo de propiedades en varios controles, solo la sangría puede hacer que sea mucho más fácil obtener una visión general rápida de dónde se establecen sus propiedades a ciertos controles.


Si está depurando su aplicación, en la mayoría de los casos debería poder usar las herramientas de depuración de VS para determinar qué asignación está causando la referencia nula.

Sin embargo, si divide la asignación en varias líneas, creo que VS apuntará a la línea correcta cuando se lance una excepción:

MyClass a = new MyClass { Field1 = Value1, Field2 = Value2 };

Nota: no lo hago yo mismo, así que sé amable con mi (posiblemente) horrible estilo de romper líneas.