Der wichtige Unterschied zwischen ValueTypes und Referenztypen besteht darin, dass Werttypen diese "Wertesemantik" haben. Ein DateTime, Int32 und alle anderen Werttypen haben keine Identität, ein Int32 "42" ist im Wesentlichen von keinem anderen Int32 mit dem gleichen Wert zu unterscheiden.
Alle Werttyp "Objekte" existieren entweder auf Stapel oder als Teil eines Referenztypobjekts. Ein spezieller Fall ist, wenn Sie eine Werttyp-Instanz auf ein Objekt oder eine Schnittstelle werfen - dies wird "Boxen" genannt und erzeugt einfach ein Dummy-Objekt vom Referenztyp, das nur den Wert enthält, der zurück extrahiert werden kann ("ungepackt"). .
Referenztypen haben auf der anderen Seite eine Identität. Ein "neues Objekt()" ist keinem anderen "neuen Objekt()" gleich, da es sich um separate Instanzen auf dem GC-Heap handelt. Einige Referenztypen bieten eine Equals-Methode und überladene Operatoren, so dass sie sich wertvoller verhalten, z. Eine Zeichenkette "abc" ist gleichbedeutend mit einer anderen "abc" Zeichenkette, auch wenn es sich tatsächlich um zwei verschiedene Objekte handelt.
Wenn Sie also einen Verweis haben, kann er entweder die Adresse eines gültigen Objekts enthalten oder er kann null sein. Wenn Werttyp-Objekte alle null sind, sind sie einfach Null. Z.B. eine Ganzzahl Null, eine Gleitkommazahl Null, Boolean false oder DateTime.MinValue. Wenn Sie zwischen "Null" und "Wert fehlt/Null" unterscheiden müssen, müssen Sie entweder ein separates boolesches Flag verwenden oder, noch besser, verwenden Sie die Nullable < T> -Klasse in .NET 2.0. Was ist einfach der Wert plus ein boolesches Flag. Es gibt auch Unterstützung in der CLR, so dass das Boxen einer Nullable mit HasValue = false zu einer Nullreferenz führt und nicht in einer Boxed-Struktur mit false + zero, wie wenn Sie diese Struktur selbst implementieren würden.
Es ist Jon nicht John. –