Warum gibt es kein zyklisches Layout-Problem für Klassen in C #?

8
%Vor%
  

Ursachen:

     

Strukturelement 'Unit.u' vom Typ 'Unit' verursacht einen Zyklus in der Struktur   Layout.

Aber

%Vor%

kompiliert. Ich verstehe das Problem, das ich vermute. Ein endloser Zyklus wird gebildet, wenn auf ein Objekt Unit verwiesen wird, da ein anderes Mitglied Unit usw. initialisiert werden muss. Aber warum schränkt der Compiler das Problem nur für structs ein? Bleibt das Problem nicht auch für class bestehen? Fehle ich etwas?

    
nawfal 13.01.2013, 23:04
quelle

4 Antworten

20

Das Problem liegt in Layout .

Wenn Unit eine Struktur ist, müsste jeder Wert für eine Unit ad infinitum einen anderen Wert desselben Typs (und damit derselben Größe) enthalten. Das ist nicht möglich. Ich nehme an, Sie könnten argumentieren, dass die Felder für Unit keine anderen Felder belegen sollten, also könnten Sie es in sich selbst enthalten - aber ich glaube, dass die Art und Weise, wie die CLR funktioniert, alle Strukturen sicherstellt nehmen Sie mindestens 1 Byte auf ...

Wenn Unit eine Klasse ist, muss ein Unit -Objekt nur eine Referenz auf ein anderes Unit -Objekt enthalten. Keine Speicherprobleme, und der Wert kann null sein, um damit zu beginnen.

Stellen Sie sich das so vor: Sie können kein Haus haben, das ein anderes Haus enthält, das nach dem gleichen Plan gebaut wurde, aber Sie können sicherlich ein Haus haben, das ein Stück Papier mit einer ähnlichen Hausadresse enthält ...

    
Jon Skeet 13.01.2013, 23:05
quelle
3

Klassen sind Referenztypen, daher stelle ich mir den Unterschied vor, dass im Beispiel class nur ein Verweis auf eine andere Instanz gespeichert werden muss. Für Ihren struct , einen Werttyp, müsste die gesamte Struktur erneut eingefügt werden, daher eine Endlosschleife.

    
Paul Phillips 13.01.2013 23:07
quelle
2

Der struct wird automatisch mit einem Wert initialisiert. In diesem Beispiel enthält ein Unit -Wert einen Unit -Wert, der einen Unit -Wert enthält, der einen Unit -Wert usw. enthält.

Ihr class -Beispiel initialisiert nur den Verweis auf null , der keinen unendlichen Rückschritt hat. Sie würden jedoch ein ähnliches Problem auftreten, wenn Sie Folgendes tun:

%Vor%

Nun konstruiert constructing ein Unit ein Unit , das ein Unit erstellt, etc ... In diesem Fall werden Sie eine Laufzeit-Stack-Überlauf-Ausnahme finden, wenn / wenn Sie versuchen, ein Unit zu instanziieren Objekt.

Ich dachte, Sie könnten das Problem struct umgehen, indem Sie einen Nullable-Typ verwenden, aber das Problem bleibt bestehen. Ich glaube, das liegt daran, dass ein NULL-Wert struct immer noch instanziiert wird, wenn auf null gesetzt ist.

    
Dave Cousineau 13.01.2013 23:15
quelle
1

Weil Struct value type sind. Unit kann den Wert als sich selbst halten? Ich denke, das ist nicht möglich.

Aber wenn Unit ist class , class sind reference type . Unit -Objekt kann eine -Referenz für das andere Unit -Objekt enthalten. Es ist in Ordnung.

    
Soner Gönül 13.01.2013 23:07
quelle