2009-08-31 7 views
5

. NET haben wir primitive Datentypen wie int und Werttypen wie struct.Wie .NET Referenz unterscheidet gegenüber primitiven und Werttypen

Und auch wir haben Referenztypen. Alle scheinen von der Objektklasse abgeleitet zu sein.

Wie .NET primitive, Werttyp gegen den Referenztyp bestimmen?

Wo ist es gemacht? Beim Compiler oder bei JIT?

Gehört dies zu den Fähigkeiten der Compiler?

+0

Es tut mir leid, aber ich verstehe Ihre Frage nicht ganz. –

Antwort

11

Alle Werttypen, einschließlich integrierter CTS-Grundtypen (Common Type System), werden DIREKT vom CTS-Typ "System.ValueType" (außer enums) abgeleitet.

So kann der Compiler durch Untersuchen des Basistyps jeder Art feststellen. Wenn es sich um "System.ValueType" handelt, handelt es sich um einen Werttyp, andernfalls handelt es sich um einen Referenztyp.

Edit: Aufzählungen, wie in

public Enum Shipper {FedEx, Aerborne, USPS, Stork} 

... ableiten nicht direkt aus System.ValueType leiten sie aus System.Enum, die aus System.ValueType leitet ...

+0

Außer 'System.Enum', das von' System.ValueType' abgeleitet ist, aber kein Werttyp ist. Aber alle 'Enum'-Typen * sind * Werttypen, die von 'System.Enum' abgeleitet sind und deren Basistyp nicht' System.ValueType' ist. Daher sind Werttypen Typen, die von 'System.ValueType' mit Ausnahme von' System.Enum' abgeleitet sind, obwohl die interne Implementierung dieses Tests effizienter durchgeführt werden kann. –

+0

Danke Charles. Funktioniert Java ähnlich? –

+0

@ 280Z28: Ich bin nicht sicher, was das bedeutet, da System.Enum kein Typ ist, den Sie direkt verwenden können. Tatsächlich ist es nicht einmal real genug, um als Einschränkung für einen generischen Typ zu dienen (siehe unten auf http://msdn.microsoft.com/en-us/library/d5x73970.aspx). –

2

Werttypen werden tatsächlich von System.ValueType abgeleitet, die selbst von System.Object abgeleitet ist.

2

Wert Typen sind von System.ValueType abgeleitet, die unter anderem eine Standard (aber langsame) Implementierung von GetHashCode und Equals gibt. (Sie sind langsam, weil sie Reflexion verwenden).

Primitive Typen wie int können mithilfe der box-Anweisung in Werttypen in IL eingereiht werden. Sie haben spezielle IL-Anweisungen, um mit ihnen zu arbeiten.

Referenztypen sind alle anderen Klassen.

Es gibt auch Zeiger, die in unsafe Code verwendet werden können und nicht von object überhaupt ableiten. BEARBEITEN - proof.

+0

Sind Sie sicher, dass Zeigertypen nicht von IntPtr abgeleitet sind? –

+0

Ja, sie sind völlig unabhängig voneinander. Zum einen ist 'IntPtr' eine Struktur und Sie können nicht von einer Struktur ableiten. – SLaks

Verwandte Themen