c# - puede - el módulo está optimizado y la opción del depurador sólo mi código está habilitada
¿Cómo depurar código inicializador de objeto? (3)
¿Hay alguna forma de depurar paso a paso el código del inicializador de objetos en Visual Studio?
Ejemplo:
return new Veranstaltung()
{
ID = tblVeranstaltung.VeranstaltungsID,
Titel = tblVeranstaltung.Titel,
KursNummer = tblVeranstaltung.Kursnummer,
ErsterTermin = tblVeranstaltung.ersterTermin,
Dauer = tblVeranstaltung.schulungsTage,
StartZeit = tblVeranstaltung.BeginnZeit,
EndZeit = tblVeranstaltung.Endzeit,
KostenNettoValue = tblVeranstaltung.PreisNetto ?? default(decimal),
IsLastMinute = tblVeranstaltung.lastMinute == 1,
IsVerkuerzt = tblVeranstaltung.istVerkuerzt == 1,
IsGeschlossen = tblVeranstaltung.istGeschlosseneVeranstaltung == 1,
IsIntern = tblVeranstaltung.istInterneVeranstaltung == 1,
StandortID = Convert.ToInt32(tblVeranstaltung.StandortID),
LastMinuteRabatt = tblVeranstaltung.lastMinuteRabatt ?? default(decimal)
};
A veces obtengo errores en este tipo de código (por ejemplo, cuando falla una conversión a int) y VS parece no poder pasar, solo arroja un error para toda la línea y tengo que probar cuál de las inicializaciones falló .
¿Hay alguna manera fácil de depurar esto o es mejor evitar el inicializador de objetos para inicializaciones grandes o complejas?
Estoy usando VS 2010 y C # 4.0.
¿o es mejor evitar el inicializador de objetos para inicializaciones grandes o complejas?
Sí, se vuelve difícil de mantener (y depurar).
El soporte de depuración para inicializadores de objetos no es muy bueno en Visual Studio 2010. Puede ser pragmático evitar el uso de inicializadores de objetos para inicializaciones grandes o complejas por esa razón, pero no considero el uso de inicializaciones de objetos grandes o complejas (por ejemplo, anidadas) una mala elección de diseño en sí misma.
He descubierto que para mapear objetos que representan documentos / registros (como su ejemplo), crea un estilo declarativo muy legible, minimiza el "ruido" en el código y permite que el lector vea más claramente la relación entre el origen y el destino . Este enfoque también fomenta la separación del mapeo de datos de la validación de datos, lo cual creo que es deseable.
Un operador de desreferencia nulo seguro también ayudaría mucho cuando se codifica en este estilo, ¡pero ese es otro tema! Con suerte, una futura actualización de Visual Studio puede mejorar la depuración de estos constructos útiles.
Los inicializadores de objetos deben mantenerse para la inicialización simple de objetos. Si se encuentra en el punto donde su constructor de objetos tiene un código que puede fallar (por ejemplo, lanzando una excepción), no lo use. Mejor confíe en un patrón de construcción de objetos , que dependiendo de sus necesidades puede ser un método de fábrica, una fábrica abstracta, etc. Esto también asegura que todos los usuarios de su clase no puedan construir una instancia que se encuentre en un estado inválido (p. olvida inicializar un miembro, o inicializan miembros relacionados con valores incorrectos, etc.)