Was sind die Unterschiede zwischen Werttypen und Referenztypen in C #? [Duplikat]

8

Ich kenne ein paar Unterschiede,

  1. Werttypen werden im Stapel gespeichert, wo sie als Referenztypen im verwalteten Heap gespeichert werden.
  2. Werttypvariablen enthalten direkt ihre Werte, wobei sie als Referenzvariablen nur einen Verweis auf den Speicherort des Objekts enthalten, das auf dem verwalteten Heap erstellt wird.

Gibt es einen anderen Unterschied, den ich übersehen habe? Wenn ja, was sind sie?

    
Chendur Pandian 10.03.2010, 06:19
quelle

4 Antworten

21

Bitte lesen Sie: Der Stapel ist ein Implementierungsdetail , und wiederhole nie wieder, dass die Stapelzuweisung die Werttypen von Referenztypen in .NET unterscheidet. Die CLR kann wählen, eine Variable an einer beliebigen Stelle zuzuordnen.

Der wichtigste Unterschied liegt in der Zuweisungssemantik. Wenn Sie einer Variablen einen Werttyp zuweisen (oder ihn einer Methode als Argument übergeben), werden alle Daten kopiert. Wenn Sie einen Referenztyp zuweisen, wird nur ein Verweis kopiert - beide Referenzen verweisen auf dieselbe Objektinstanz im Speicher.

    
Aaronaught 10.03.2010, 06:29
quelle
14

Hier sind einige zusätzliche Unterschiede:

  1. Werttypen können nicht vererbt werden, Referenztypen hingegen können
  2. Werttypen werden als Struktur implementiert, Referenztypen als Klasse
  3. Werttypen können standardmäßig keine echten Nullwerte zugewiesen werden (die? -Syntax ist eine Problemumgehung und führt immer noch nicht zu einem echten Nullwert)
  4. Wenn Sie einer anderen Variablen einen Werttyp zuweisen oder ihn als Parameter in einer Methode übergeben, wird eine Kopie davon erstellt, während die Variable bei einem Referenztyp den Speicherort des Objekts
  5. darstellt
  6. Es ist ein Fehler bei der Kompilierung für eine Struktur, einen expliziten, parameterlosen Konstruktor zu deklarieren, aber das selbe gilt nicht für eine Klasse
  7. Es ist ein Fehler bei der Kompilierung, das "this" -Objekt zu verwenden, bevor alle Felder in einer Struktur zugewiesen wurden, aber dasselbe gilt nicht für eine Klasse
  8. Es ist ein Kompilierungsfehler für eine Struktur, um nicht alle Eigenschaften in ihrem Konstruktor vollständig zuzuweisen, aber das selbe gilt nicht für eine Klasse
Zaid Masud 22.05.2012 14:54
quelle
2

Wie von Aaronaught und Eric Blogpost erwähnt:

Merken Sie sich die Regel, Referenztypen gehen immer zum Heap, während Value-Typen immer dorthin gehen, wo sie deklariert wurden? Wenn ein Werttyp außerhalb einer Methode deklariert wird, aber innerhalb eines Referenztyps, wird er innerhalb des Referenztyps auf dem Heap platziert.

    
Bhaskar 10.03.2010 06:54
quelle
0

Ich denke, Werte sind implizit Speicher zugeordnet, aber nicht Referenztypen sie Speicher explizit zugewiesen werden müssen

    
tariq 22.05.2012 13:13
quelle

Tags und Links