Methoden zur Lazy-Initialisierung mit Eigenschaften

8

Ich ändere gerade eine weit verbreitete Klasse, um so viel von der teuren Initialisierung aus dem Klassenkonstruktor in Lazy Initialized-Eigenschaften zu verschieben. Unten ist ein Beispiel (in c #):

Vorher:

%Vor%

Nachher: ​​

%Vor%

Es gibt ein paar mehr dieser Eigenschaften in der Klasse, die ich verändere, und einige werden in bestimmten Kontexten nicht verwendet (daher die Faulheit), aber wenn sie benutzt werden, werden sie wahrscheinlich wiederholt aufgerufen.

Leider werden die Eigenschaften oft auch innerhalb der Klasse verwendet. Dies bedeutet, dass die private Variable (_b) potenziell direkt von einer Methode verwendet werden kann, ohne dass sie initialisiert wird.

Gibt es eine Möglichkeit, nur die öffentliche Eigenschaft (B) innerhalb der Klasse verfügbar zu machen, oder sogar eine alternative Methode mit der gleichen Initialisierung, wenn sie benötigt wird?

Dies wird von Programmierern neu gepostet (anscheinend nicht subjektiv genug): Ссылка

    
Stu Pegg 06.01.2011, 15:57
quelle

3 Antworten

6

Sie könnten in Betracht ziehen, die Lazy-Eigenschaften in eine Basisklasse zu verschieben, um direkten Zugriff auf die Hintergrundvariable zu vermeiden. Nicht ideal, ich weiß. Ich habe immer gedacht, dass etwas in C # fehlt, d. H. Direkte Unterstützung für faule Eigenschaften.

    
Tim Lloyd 06.01.2011, 16:00
quelle
16

Nun, meine empfohlene Lösung wäre es, Ihrem Mitarbeiter zu sagen, dass er die Eigenschaft nutzen soll, nicht das Feld. Aber Sie könnten es bis zu einem gewissen Grad idiotensicher machen:

%Vor%

Jetzt ist es ziemlich schwer zu vermasseln.

    
mquander 06.01.2011 15:59
quelle
3

@chibacity hat (und später) deleted [und später undeleeted: P] eine alternative Option mit einer abstrakten Basisklasse gepostet. Obwohl es in Bezug auf die Codeverteilung möglicherweise nicht ideal ist, bietet es eine schöne Kapselung, die eine Menge Code-Clutter-Erzeugung für eine sauberere und prägnantere Klasse A entfernt. Zum Beispiel könnten Sie überlegen, die Techniken zu kombinieren, um beide Ziele zu erreichen:

%Vor%

Auf den ersten Blick sieht es so aus, als wäre das mehr umständlich, aber wenn Sie bedenken, dass ClassA die Klasse ist, in der Sie arbeiten würden, bedeutet das jetzt, dass alle Ihre Referenzen die gleiche Eigenschaft durchlaufen - es gibt kein überflüssiges Feld, das zu Verwirrung führen kann. Es gibt keine Möglichkeit, die Eigenschaft zu umgehen, um direkt auf _b zu verweisen, und es ist nicht nötig, Ihrem Mitarbeiter mitzuteilen, welche Methode er verwenden soll ... es gibt nur eine.

Ich sage nicht, dass dies der richtige Weg ist, dies zu tun, oder dass dies ein Muster ist, dem man folgen sollte oder sollte. Ich weise nur auf die Vorteile hin, die @chibacity vorgeschlagen hat und die sonst unbemerkt bleiben könnten.

>

Es wäre nett, wenn Sie implizite Lazy-geladene Eigenschaften hätten, ohne auf B.Value zu verweisen ... zum Beispiel:

%Vor%

oder für Objekte ohne parameterlose Konstruktoren

%Vor%

oder vielleicht als @chibacity in einem Kommentar vorgeschlagen

%Vor%

oder

%Vor%

Leider denke ich, dass keine dieser Lösungen in irgendeiner Form verfügbar sind ...

    
BenAlabaster 06.01.2011 16:55
quelle