Ich habe eine seltsame Angewohnheit, wie es scheint ... zumindest laut meinem Kollegen. Wir haben zusammen an einem kleinen Projekt gearbeitet. Ich habe die Klassen so geschrieben (vereinfachtes Beispiel):
[Serializable()]
public class Foo
{
public Foo()
{ }
private Bar _bar;
public Bar Bar
{
get
{
if (_bar == null)
_bar = new Bar();
return _bar;
}
set { _bar = value; }
}
}
Im Grunde genommen initialisiere ich ein Feld nur, wenn ein Getter aufgerufen wird und das Feld immer noch null ist. Ich dachte, dies würde die Überlastung verringern, indem keine Eigenschaften initialisiert werden, die nirgendwo verwendet werden.
ETA: Der Grund, warum ich dies getan habe, ist, dass meine Klasse mehrere Eigenschaften hat, die eine Instanz einer anderen Klasse zurückgeben, die wiederum auch Eigenschaften mit noch mehr Klassen haben, und so weiter. Wenn Sie den Konstruktor für die oberste Klasse aufrufen, werden anschließend alle Konstruktoren für alle diese Klassen aufgerufen, wenn nicht immer alle benötigt werden.
Gibt es andere Einwände gegen diese Praxis als persönliche Vorlieben?
UPDATE: Ich habe die vielen unterschiedlichen Meinungen in Bezug auf diese Frage berücksichtigt und werde zu meiner akzeptierten Antwort stehen. Jetzt habe ich das Konzept jedoch viel besser verstanden und kann entscheiden, wann ich es verwenden soll und wann nicht.
Nachteile:
- Thread-Sicherheitsprobleme
- Eine "Setter" -Anforderung nicht befolgen, wenn der übergebene Wert null ist
- Mikrooptimierungen
- Die Ausnahmebehandlung sollte in einem Konstruktor erfolgen
- Im Klassencode muss nach Null gesucht werden
Vorteile:
- Mikrooptimierungen
- Eigenschaften geben niemals null zurück
- Verzögern oder vermeiden Sie das Laden "schwerer" Objekte
Die meisten Nachteile gelten nicht für meine aktuelle Bibliothek, ich müsste jedoch testen, ob die "Mikrooptimierungen" überhaupt etwas optimieren.
LETZTES UPDATE:
Okay, ich habe meine Antwort geändert. Meine ursprüngliche Frage war, ob dies eine gute Angewohnheit ist oder nicht. Und ich bin jetzt davon überzeugt, dass es nicht so ist. Vielleicht werde ich es in einigen Teilen meines aktuellen Codes noch verwenden, aber nicht unbedingt und definitiv nicht die ganze Zeit. Also werde ich meine Gewohnheit verlieren und darüber nachdenken, bevor ich es benutze. Vielen Dank an alle!