16 Stimmen

Erben Werttypen (Integer, Decimal, Boolean, usw.) von Object?

Auf der Suche nach Klarstellung zu diesem Thema...

Ich habe gehört, dass in .Net 'alles' von Object erbt. Ich habe auch gehört, dass der Unterschied zwischen Werttypen und Referenztypen darin besteht, dass Referenztypen von Object erben und Werttypen nicht.

Mein Verständnis war, dass alles ein Objekt ist (von System.Object erbt); aber Werttypen und Referenztypen einfach 'unterschiedlich' voneinander sind. Werttypen werden auf dem Stapel allokiert und Referenztypen erhalten einen 'Zeiger', der auf dem Stapel platziert ist und auf eine Adresse auf dem Heap zeigt.

Ist das das Wesentliche daran? Was macht einen Integer zu einem Werttyp? Ist das etwas, das in der Sprache angeboren ist?

21voto

Jon Skeet Punkte 1325502

Es kommt darauf an, wie Sie die Terminologie betrachten - was davon abhängt, ob Sie über C# oder die CLI-Spezifikation sprechen. Zum Beispiel besagen die Abschnitte 8.9.8 und 8.9.10 der CLI-Spezifikation (ECMA-355):

Werttypen erben nicht, obwohl der zugehörige geboxte Typ ein Objekttyp ist und daher von anderen Typen erbt.

und

In ihrer unboxten Form erben Werttypen nicht von einem Typ. Geboxte Werttypen erben direkt von System.ValueType es sei denn, es handelt sich um Aufzählungen, die in diesem Fall von System.Enum erben. Geboxte Werttypen sind versiegelt.

Von der Sicht der CLI aus betrachtet ist die Antwort auf die Frage also nein.

Allerdings werfen wir einen Blick auf die C#-Spezifikation - und da wir uns in Stimmung wie bei ECMA befinden, wählen wir diese Version (die derzeit bei C# 2 stecken geblieben ist). Abschnitt 11.1.1 besagt:

Alle Werttypen erben implizit von der Klasse System.ValueType, die wiederum von der Klasse object erbt.

Von der Sicht der C#-Spezifikation aus betrachtet ist die Antwort also ja.

Man könnte argumentieren, dass Sie Ihre Frage mit ".net" getaggt haben, also sollten wir die CLI-Definition verwenden; wenn Sie es mit "c#" getaggt hätten, sollten wir die C#-Definition verwenden. Sehen Sie, wie willkürlich das ist? :)

All dieses Spezifikations-Tauchen dient jedoch nicht wirklich einem praktischen Zweck. Die Antwort hängt von den Feinheiten der Definitionen ab. Es ist sinnvoller, eine interessante Situation zu konstruieren, in der es darauf ankommt... also, was möchten Sie tun? Wenn Sie etwas Code vorlegen können, können wir Fragen beantworten, was passieren wird - und das ist wichtiger als Definitionen.

(Ja, das ist ungewöhnlich für mich - im Allgemeinen ist mir die Terminologie sehr wichtig. In einigen Fällen sind die Feinheiten jedoch eher ein Fluch als ein Segen.)

20voto

Broam Punkte 4548

Wertetypen wie Int32 sind Strukturen.

Aus der VS 2008 C# Hilfe Datei (da ich sie geöffnet hatte) zu Strukturen:

Eine Struktur kann nicht von einer anderen Struktur oder Klasse erben und kann nicht die Basis einer Klasse sein. Alle Strukturen erben direkt von System.ValueType, das von System.Object erbt.

6voto

BenAlabaster Punkte 37617

Laut Red Gate's .NET Reflector erben sie (indirekt) von object.

  • Object -> ValueType -> int32
  • Object -> ValueType -> boolean
  • Object -> ValueType -> decimal
  • Object -> ValueType -> byte
  • Object -> ValueType -> char
  • Object -> ValueType -> uint32

Ich habe keine anderen Typen überprüft, aber es scheint so zu sein. Ich kann Reflector nur wärmstens empfehlen - es ist ein kostenloser Download und es wird Ihnen helfen, unzählige andere Fragen darüber zu beantworten, wie verschiedene Teile des .NET-Frameworks codiert sind. Manchmal frage ich mich, wie ich ohne ihn leben würde.

Das großartigste an Reflector ist, dass Sie sich nicht auf potenziell veraltete (oder falsch oder schlecht interpretierte) Texte anderer Personen verlassen müssen, um herauszufinden, was wirklich im Inneren des .NET Frameworks passiert - einschließlich dem auf MSDN - nicht einmal das allmächtige Microsoft ist unfehlbar. Die Dokumentation ist nur so aktuell wie ihre letzte Änderung. Wenn Sie Ihre Antworten direkt aus dem Code erhalten, ist dies am wenigsten wahrscheinlich falsch zu sein - vorausgesetzt natürlich, dass Sie in der Lage sind, diesen Code korrekt zu interpretieren ;)

4voto

Fredrik Mörk Punkte 151006

Werttypen erben auch von Object, aber nicht direkt. Sie erben von ValueType, das wiederum Object erbt.

4voto

eglasius Punkte 35447

Werttypen erben (indirekt) von Objekt

... aber nicht alles in .NET erbt von Objekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X