2011-01-09 14 views
4

stellte ich nur ein einfaches Programm, bis zu testen, wie der Code innerhalb eines get-Accessor ausführt (da ich in einem anderen Projekt einige Probleme gehabt hatte), und fand etwas ganz merkwürdig:Seltsame Ausführung von Get Accessor in C#?

class Program { 
    static void Main(string[] args) { 
     var test = new TestClass(); 
     var testBool = test.TestBool; 
    } 
} 

public class TestClass { 
    private bool _testBool = true; 
    public bool TestBool { 
     get { 
      if (_testBool) { 
       Console.WriteLine("true!"); 
      } else { 
       Console.WriteLine("false! WTF!"); 
      } 
      _testBool = false; 
      return _testBool; 
     } 
    } 
} 

ich den Ausgang zu erwarten be

wahr!

Aber was ich bekam, war stattdessen

wahr!

falsch! WTF!

Nur was ist hier los?

+6

Sie führen das Programm im Debugger? Der Debugger wird Eigenschaft Getter hinter Ihrem Rücken aufrufen. –

+4

Warum haben Sie diese Frage nach dem Löschen erneut? Die Lösung ist wahrscheinlich die gleiche "IDE führt die Accessor, weil es erwartet, dass es keine Nebenwirkungen hat "Ding. –

+1

entfernen Sie' test.TestBool' aus der Uhr oder führen Sie die Anwendung ohne Debugging. –

Antwort

10

Wenn ich raten müsste, würde ich sagen, dass der Debugger einmal ausgeführt, um die Mitglieder einer lokalen Variablen in der IDE zu zeigen.

Wenn Sie Nebenwirkungen in Eigenschaften haben (die Sie sollten nicht), laufen sie nicht in der IDE :)

es an der Konsole Versuchen; es sollte sich dort verhalten.

+4

Heilige Kuh, wie hast du das beantwortet, bevor es gefragt wurde? Supermod Frage Fusion Kräfte? –

+0

@Ben: Der Fragesteller hat diese Frage früher gestellt, dann gelöscht und dann erneut gefragt. Marc hat die gelöschte Frage mit dieser verschmolzen. –

+1

+1 Ich kann es nur reproduzieren, wenn ich Maus über die TestBool-Eigenschaft, die dann verursacht, dass der Getter aufgerufen wird. – BrokenGlass

8

Keine Repro.

Und nicht Getters mit Nebenwirkungen schreiben.

+1

+1 für "schreibe keine Eigenschaften mit Nebenwirkungen" (weil ich nicht +100!). –

+1

@Jason: Hank hatte es richtig - es ist nur Getter, die keine Nebenwirkungen haben sollte, Nebenwirkungen in Setter (z. B. Eigenschaft notify Listener) sind völlig in Ordnung. –

+0

@Ben: Ich stimmte mit Henk überein. Natürlich * erwartete, intuitive * "Nebenwirkungen" in Settern sind in Ordnung.Aber Programmierer erwarten natürlich, dass Eigenschaften * leicht * sind, also * unerwartete * Nebeneffekte können böse sein (zum Beispiel: Eine Eigenschaft setzen und die Werte anderer scheinbar nicht verwandter Eigenschaften ändern; Eine Eigenschaft setzen und 5 Sekunden lang nicht zurückkehren Es zeichnet einige UI neu und schreibt den Datensatz in eine Datenbank. Eigenschaften können schwer missbraucht werden und * sehr * schwierig zu debuggen, besonders da * selbst der Debugger annimmt, dass sie leichtgewichtig und Einzelschritte über ihnen sind, als wären sie einfache Variablen *. –