La finestra di Heisenberg
Questo può morderti male se stai facendo cose load-on-demand, come questo:
private MyClass _myObj;
public MyClass MyObj {
get {
if (_myObj == null)
_myObj = CreateMyObj(); // some other code to create my object
return _myObj;
}
}
Ora supponiamo che tu abbia del codice altrove usando questo:
// blah
// blah
MyObj.DoStuff(); // Line 3
// blah
Ora vuoi eseguire il debug del tuo CreateMyObj()
metodo. Quindi metti un punto di interruzione sulla riga 3 sopra, con l'intenzione di entrare nel codice. Solo per una buona misura, hai anche messo un breakpoint sulla linea sopra che dice _myObj = CreateMyObj();
, e persino un breakpoint dentro di CreateMyObj()
sé.
Il codice raggiunge il punto di interruzione sulla riga 3. Si entra nel codice. Ti aspetti di inserire il codice condizionale, perché _myObj
ovviamente è nullo, giusto? Uh ... quindi ... perché ha saltato la condizione ed è andato dritto a return _myObj
?! Passa il mouse sopra _myObj ... e in effetti ha un valore! Come è successo?!
La risposta è che il tuo IDE gli ha fatto ottenere un valore, perché hai una finestra "watch" aperta, in particolare la finestra "Autos", che mostra i valori di tutte le variabili / proprietà rilevanti per la linea di esecuzione corrente o precedente. Quando raggiungi il tuo punto di interruzione sulla Linea 3, la finestra dell'orologio ha deciso che ti sarebbe interessato conoscere il valore di MyObj
- quindi dietro le quinte, ignorando qualsiasi tuo punto di interruzione , è andato e ha calcolato il valore MyObj
per te - inclusa la chiamata a CreateMyObj()
quella imposta il valore di _myObj!
Ecco perché la chiamo Heisenberg Watch Window: non puoi osservare il valore senza influenzarlo ... :)
GOTCHA!
modificare - Sento che il commento di @ ChristianHayter merita l'inclusione nella risposta principale, perché sembra una soluzione efficace per questo problema. Quindi ogni volta che hai una proprietà pigra ...
Decorare la proprietà con [DebuggerBrowsable (DebuggerBrowsableState.Never)] o [DebuggerDisplay ("<caricato su richiesta>")]. - Christian Hayter