La ventana de vigilancia de Heisenberg
Esto puede morderte mal si estás haciendo cosas de carga a pedido, como esta:
private MyClass _myObj;
public MyClass MyObj {
get {
if (_myObj == null)
_myObj = CreateMyObj(); // some other code to create my object
return _myObj;
}
}
Ahora digamos que tiene algún código en otro lugar usando esto:
// blah
// blah
MyObj.DoStuff(); // Line 3
// blah
Ahora quieres depurar tu CreateMyObj()
método. Entonces pones un punto de interrupción en la línea 3 anterior, con la intención de ingresar al código. Solo por si acaso, también pones un punto de interrupción en la línea de arriba que dice _myObj = CreateMyObj();
, e incluso un punto de interrupción dentro de CreateMyObj()
sí mismo.
El código llega a su punto de interrupción en la línea 3. Entras en el código. Espera ingresar el código condicional, porque _myObj
obviamente es nulo, ¿verdad? Uh ... entonces ... ¿por qué se saltó la condición y se fue directamente return _myObj
? Pasa el mouse sobre _myObj ... y, de hecho, ¡tiene un valor! ¡¿Cómo pasó eso?!
La respuesta es que su IDE provocó que obtuviera un valor, porque tiene abierta una ventana de "observación", especialmente la ventana de observación "Autos", que muestra los valores de todas las variables / propiedades relevantes para la línea de ejecución actual o anterior. Cuando llegaste a tu punto de interrupción en la línea 3, la ventana del reloj decidió que te interesaría saber el valor de MyObj
, por lo que detrás de escena, ignorando cualquiera de tus puntos de interrupción , se fue y calculó el valor MyObj
para ti, incluida la llamada a CreateMyObj()
ese establece el valor de _myObj!
Es por eso que llamo a esto la Ventana de vigilancia de Heisenberg: no se puede observar el valor sin afectarlo ... :)
GOTCHA!
Editar : creo que el comentario de @ ChristianHayter merece ser incluido en la respuesta principal, porque parece una solución efectiva para este problema. Entonces, cada vez que tenga una propiedad con carga lenta ...
Decora tu propiedad con [DebuggerBrowsable (DebuggerBrowsableState.Never)] o [DebuggerDisplay ("<cargado bajo demanda>")]. - Christian Hayter