Das Heisenberg-Uhrenfenster
Dies kann Sie schwer beißen, wenn Sie Load-on-Demand-Aufgaben ausführen, wie folgt:
private MyClass _myObj;
public MyClass MyObj {
get {
if (_myObj == null)
_myObj = CreateMyObj(); // some other code to create my object
return _myObj;
}
}
Angenommen, Sie haben an anderer Stelle Code, der Folgendes verwendet:
// blah
// blah
MyObj.DoStuff(); // Line 3
// blah
Jetzt möchten Sie Ihre CreateMyObj()
Methode debuggen . Sie setzen also einen Haltepunkt in Zeile 3 oben, um in den Code einzusteigen. Nur für ein gutes Maß setzen Sie auch einen Haltepunkt in die Zeile darüber _myObj = CreateMyObj();
und sogar einen Haltepunkt in CreateMyObj()
sich.
Der Code trifft Ihren Haltepunkt in Zeile 3. Sie betreten den Code. Sie erwarten, den bedingten Code einzugeben, da dieser _myObj
offensichtlich null ist, oder? Äh ... also ... warum hat es die Bedingung übersprungen und ist direkt zu return _myObj
?! Sie bewegen Ihre Maus über _myObj ... und tatsächlich hat es einen Wert! Wie ist das passiert?!
Die Antwort ist, dass Ihre IDE einen Wert erhalten hat, weil Sie ein "Überwachungs" -Fenster geöffnet haben - insbesondere das Überwachungsfenster "Autos", in dem die Werte aller Variablen / Eigenschaften angezeigt werden, die für die aktuelle oder vorherige Ausführungszeile relevant sind. Wenn Sie Ihren Haltepunkt auf der Linie 3, entschied das Ãœberwachungsfenster , dass Sie daran interessiert wäre , den Wert zu kennen MyObj
- so hinter den Kulissen, ignoriert alle Ihre Haltepunkte , es ging und den Wert berechnet MyObj
für Sie - einschließlich der Anruf , CreateMyObj()
dass setzt den Wert von _myObj!
Deshalb nenne ich das das Heisenberg-Uhrfenster - man kann den Wert nicht beobachten, ohne ihn zu beeinflussen ... :)
ERWISCHT!
Bearbeiten - Ich bin der Meinung, dass der Kommentar von @ ChristianHayter die Aufnahme in die Hauptantwort verdient, da er eine effektive Problemumgehung für dieses Problem darstellt. Also, wann immer Sie eine faul geladene Eigenschaft haben ...
Dekorieren Sie Ihre Immobilie mit [DebuggerBrowsable (DebuggerBrowsableState.Never)] oder [DebuggerDisplay ("<bei Bedarf geladen>")]. - Christian Hayter