Ein Getter, der andere Eigenschaften und Methoden aufruft, um seinen eigenen Wert zu berechnen, impliziert auch eine Abhängigkeit. Wenn Ihre Eigenschaft beispielsweise in der Lage sein muss, sich selbst zu berechnen, und dafür ein anderes Mitglied festgelegt werden muss, müssen Sie sich über versehentliche Nullverweise Gedanken machen, wenn auf Ihre Eigenschaft im Initialisierungscode zugegriffen wird, in dem nicht unbedingt alle Mitglieder festgelegt sind.
Das bedeutet nicht, dass Sie niemals auf ein anderes Mitglied zugreifen, das nicht das Eigenschafts-Backing-Feld innerhalb des Getters ist. Es bedeutet nur, dass Sie darauf achten, was Sie über den erforderlichen Status des Objekts implizieren und ob dieser dem von Ihnen erwarteten Kontext entspricht Diese Eigenschaft in zugegriffen werden.
In den beiden konkreten Beispielen, die Sie gegeben haben, ist der Grund, warum ich eines vor dem anderen wählen würde, völlig anders. Ihr Getter wird beim ersten Zugriff initialisiert, z . B. Lazy Initialization . Es wird angenommen, dass das zweite Beispiel zu einem früheren Zeitpunkt initialisiert wird, z . B. Explizite Initialisierung .
Wann genau die Initialisierung erfolgt, kann wichtig sein oder auch nicht.
Beispielsweise kann es sehr sehr langsam sein und muss während eines Ladeschritts ausgeführt werden, bei dem der Benutzer eine Verzögerung erwartet, anstatt dass die Leistung unerwartet nachlässt, wenn der Benutzer zum ersten Mal den Zugriff auslöst (dh Benutzer klickt mit der rechten Maustaste, Kontextmenü wird angezeigt, Benutzer) hat schon wieder rechts geklickt).
Manchmal gibt es auch einen offensichtlichen Punkt bei der Ausführung, an dem alles auftritt, was den zwischengespeicherten Eigenschaftswert beeinflussen / verschmutzen kann. Möglicherweise überprüfen Sie sogar, ob sich keine der Abhängigkeiten ändert, und lösen später Ausnahmen aus. In dieser Situation ist es sinnvoll, den Wert an diesem Punkt auch zwischenzuspeichern, auch wenn die Berechnung nicht besonders teuer ist, nur um zu vermeiden, dass die Codeausführung komplexer und mental schwerer nachzuvollziehen ist.
Trotzdem ist Lazy Initialization in vielen anderen Situationen sehr sinnvoll. Wie es bei der Programmierung oft vorkommt, ist es schwierig, sich auf eine Regel zu beschränken, und es kommt auf den konkreten Code an.