Verschachtelte Verwendung von C # -Objektinitialisierungen

8

also, Objektinitialisierer sind alle Arten von handlichen - vor allem, wenn Sie linq tun, wo sie geradezu notwendig sind - aber ich kann das nicht ganz herausfinden:

%Vor%

wie folgt verwenden:

%Vor%

als Initialisierer:

%Vor%

das funktioniert nicht, class1 ist angeblich eine nicht zugewiesene lokale Variable. In Linq wird es noch schwieriger, wenn Sie etwas wie

machen %Vor%

es hat nicht einmal einen Namen, um darauf zu verweisen!

Wie komme ich da rum? kann ich einfach verschachtelte Referenzen nicht mit Objektinitialisatoren machen?

    
Andy Hohorst 27.04.2009, 22:00
quelle

6 Antworten

6
  

kann ich einfach verschachtelte Referenzen mit Objektinitialisierer machen?

Sie haben Recht - Sie können nicht. Es würde einen Zyklus geben; A benötigt B für die Initialisierung, aber B benötigt A vor. Um genau zu sein - Sie können natürlich verschachtelte Objektinitialisierer machen, aber nicht mit zirkulären Abhängigkeiten.

Aber Sie können - und ich würde vorschlagen, Sie sollten, wenn möglich - dies wie folgt arbeiten.

%Vor%

Das Erstellen der Relation innerhalb der Eigenschaft hat den Vorteil, dass Sie keinen inkonsistenten Zustand erhalten, wenn Sie eine der Initialisierungsanweisungen vergessen. Es ist ziemlich offensichtlich, dass dies eine suboptimale Lösung ist, da Sie zwei Anweisungen benötigen, um eine Sache zu erledigen.

%Vor%

Mit der Logik in den Eigenschaften erhalten Sie die Sache mit nur einer Aussage erledigt.

%Vor%

Oder umgekehrt.

%Vor%

Und schließlich mit Objektinitialisierersyntax.

%Vor%     
Daniel Brückner 27.04.2009, 22:08
quelle
2

Das können Sie nicht mit Objektinitialisierern tun. Sie können jedoch den Trick mit Propery-Code tun:

%Vor%

Aufruf es:

%Vor%     
tofi9 27.04.2009 22:16
quelle
1

Dieses Problem ist nicht spezifisch für Objektinitialisierer, es ist eine allgemeine Einschränkung in der C # -Sprache. Sie können eine lokale Variable erst verwenden, wenn sie definitiv zugewiesen wurde. Hier ist eine einfachere Repro

%Vor%     
JaredPar 27.04.2009 22:07
quelle
1

Ich denke nicht, dass es trotzdem etwas gibt, wenn die Anwendung das Class1-Objekt instanziiert, das das Class2-Objekt zuerst erstellt haben muss, damit es weiß, wo sich die Referenz im Speicher befindet. Sie können dies sehen, wenn Sie Folgendes versuchen:

%Vor%

Dies wird kompiliert und ausgeführt, aber die Elterneigenschaft von Klasse2 ist Null, da der Wert zu dem Zeitpunkt war, zu dem die innere Codezeile ausgeführt wurde, was bedeutet, dass die innerste Zeile als erste ausgeführt wurde.

    
Martin Harris 27.04.2009 22:09
quelle
0

Sie können sicherlich verschachtelte Objektinitialisierer verwenden, ich mache es die ganze Zeit.

In Ihrem speziellen Fall haben Ihre Objekte jedoch einen Zirkelbezug. Sie müssen die Instanz instantiieren, bevor Sie sie der anderen zuweisen. Andernfalls geben Sie dem Compiler ein klassisches Problem mit Hähnchen und Eiern , das er nicht verarbeiten kann.

    
Eric King 27.04.2009 22:11
quelle
0

Ihr Beispiel spiegelt kein gutes Klassendesign wider, IMO; es ist unangemessen zusammenhängend und schafft eine zirkuläre Referenz. Das macht es unmöglich, sie in einem einzigen Ausdruck zusammenzufassen.

Ich würde vorschlagen, dass du zurück zum Zeichenbrett gehst und deine Klassen in eine Eltern / Kind-Beziehung umgestaltest. Ich würde die Konstruktorinjektion für die Kindklasse verwenden und das Kind dem Elternteil mitteilen, dass es ein Kind davon ist.

Zum Beispiel:

%Vor%

Dann in Ihrem Anrufcode:

%Vor%

Und ja, das funktioniert in LINQ:

%Vor%
  

Aber wie mache ich dann all das?   ChildClass hat dieselbe ParentClass   Instanz? - Andy Hohorst

Dann müssen Sie die Elternklasse im Voraus wissen.

%Vor%

oder

%Vor%     
Randolpho 27.04.2009 22:39
quelle

Tags und Links