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

8

Auf der Suche nach einer Klärung ...

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

Mein Verständnis war, dass alles ein Objekt war (erbt von System.Object); Werttypen und Referenztypen unterschieden sich jedoch einfach voneinander. Werttypen werden auf dem Stack zugewiesen, und Referenztypen erhalten einen "Zeiger", der auf dem Stack platziert wird, der auf eine Adresse auf dem Heap zeigt.

Ist das der Kern davon? Was macht eine Ganzzahl zu einem Werttyp? Das ist etwas in der Sprache inhärent?

    
Rob P. 24.11.2009, 22:25
quelle

8 Antworten

17

Werttypen wie Int32 sind Strukturen.

Aus der VS 2008 C # Hilfedatei (seit ich sie geöffnet hatte) auf structs:

  

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

erbt
    
Broam 24.11.2009, 22:27
quelle
12

Das hängt davon ab, wie Sie die Terminologie sehen - je nachdem, ob Sie über C # oder die CLI-Spezifikation sprechen. In den Abschnitten 8.9.8 und 8.9.10 der CLI-Spezifikation (ECMA-355) beispielsweise heißt es:

  

Werttypen erben jedoch nicht   Der zugehörige eingerahmte Typ ist ein Objekt   type und daher von anderen erbt   Typen.

und

  

In ihrer ungepackten Form tun Werttypen dies   nicht von irgendeinem Typ erben. Boxed Wert   Typen erben direkt von    System.ValueType , außer sie sind   Aufzählungen, in welchem ​​Fall sie   Erben von System.Enum . Verpackt   Werttypen müssen versiegelt werden.

Aus der Sicht des CLI lautet die Antwort auf die Frage no .

Aber schauen wir uns die C # -Spezifikation an - und da wir uns in einer ECMA-ähnlichen Stimmung befinden, wollen wir uns für diese Version entscheiden (die momentan bei C # 2 steckt). Abschnitt 11.1.1 besagt:

  

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

Aus der Sicht der C # -Spezifikation ist die Antwort ja .

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

All dieses Spec-Diving ist jedoch nicht sehr praktisch. Die Antwort hängt von den Feinheiten der Definitionen ab. Es ist sinnvoller, eine interessante Situation zu konstruieren, wo es darauf ankommt ... Was willst du also tun? Wenn Sie etwas Code präsentieren können, können wir Fragen dazu 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 mehr ein Fluch als ein Segen.)

    
Jon Skeet 24.11.2009 22:39
quelle
5

Nach dem .NET-Reflektor von Red Gate erben sie (indirekt) von einem Objekt.

  • Objekt - & gt; Werttyp - & gt; int32
  • Objekt - & gt; Werttyp - & gt; Boolescher
  • Objekt - & gt; Werttyp - & gt; Dezimal
  • Objekt - & gt; Werttyp - & gt; Byte
  • Objekt - & gt; Werttyp - & gt; Zeichen
  • Objekt - & gt; Werttyp - & gt; uint32

Ich habe andere Typen nicht überprüft, aber es scheint, dass sie es tun. Ich empfehle dringend, Reflektor zu bekommen - 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. An manchen Tagen frage ich mich, wie ich ohne es leben würde.

Das Beste an Reflector ist, dass Sie sich nicht auf das möglicherweise veraltete (oder falsche oder schlecht interpretierte) Schreiben einer Person verlassen müssen, um herauszufinden, was wirklich in .NET Framework ist - einschließlich das auf MSDN - nicht einmal der allmächtige Microsoft ist unfehlbar. Die Dokumentation ist nur so aktuell wie ihre letzte Änderung. Es ist am wenigsten wahrscheinlich, dass Sie Ihre Antworten direkt aus dem Code erhalten - vorausgesetzt, Sie können den Code korrekt interpettieren;)

    
BenAlabaster 24.11.2009 22:29
quelle
4

-Werttypen erben (indirekt) von Objekt

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

    
eglasius 24.11.2009 22:27
quelle
3

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

    
Fredrik Mörk 24.11.2009 22:27
quelle
3

Ja, Werttypen erben von Objekt.

Siehe Vererbungshierarchie hier: Ссылка

Der Abschnitt Hinweise auf derselben Seite sagt wörtlich:

  

Beide Referenz- und Werttypen sind   abgeleitet von der ultimativen Basisklasse   Objekt.

    
CesarGon 24.11.2009 22:29
quelle
2

Kurz gesagt, nicht alles kommt von object , es gibt Ausnahmen. Dieser Blogbeitrag von Eric Lippert ist wahrscheinlich die beste Referenz zu diesem Thema: " Nicht alles ergibt sich aus dem Objekt "

Alle struct s werden implizit von System.ValueType abgeleitet.

Der Unterschied zwischen Werttypen und Referenztypen ist ein semantisches Problem: Werttypen weisen eine Wertesemantik auf, während Referenztypen eine Wertesemantik aufweisen. Implementierungsdetails (z. B. wo sie zugeordnet sind usw. sind nicht wichtig).

int s sind beispielsweise Werttypen, weil sie struct s sind. Natürlich modellieren wir int s als Werttypen, weil sie Werte repräsentieren und wir Wert-Semantik, nicht Referenz-Semantik wollen.

    
jason 24.11.2009 22:28
quelle
2

von MSDN: ( Ссылка )

Werttypen

Die Werttypen bestehen aus zwei Hauptkategorien:

%Vor%

Die Strukturtypen enthalten die benutzerdefinierten Strukturtypen und die folgenden integrierten einfachen Typen:

%Vor%

Hauptmerkmale von Werttypen

Eine Variable eines Werttyps enthält immer einen Wert dieses Typs. Die Zuweisung zu einer Variablen eines Werttyps erzeugt eine Kopie des zugeordneten Wertes, während die Zuweisung zu einer Variablen eines Referenztyps eine Kopie des Verweises, aber nicht des referenzierten Objekts erzeugt.

Alle Werttypen werden implizit von der Object-Klasse abgeleitet.

Im Gegensatz zu Referenztypen ist es nicht möglich, einen neuen Typ aus einem Werttyp abzuleiten. Wie Referenztypen können auch Strukturen Schnittstellen implementieren.

Im Gegensatz zu Referenztypen ist es für einen Werttyp nicht möglich, den Nullwert zu enthalten.

Jeder Werttyp hat einen impliziten Standardkonstruktor, der den Standardwert dieses Typs initialisiert. Informationen zu Standardwerten von Werttypen finden Sie unter Tabelle mit Standardwerten.

Hauptfunktionen einfacher Typen

Alle einfachen Typen sind Aliase der .NET Framework-Systemtypen. Zum Beispiel ist int ein Alias ​​von System.Int32. Eine vollständige Liste der Aliase finden Sie in der Tabelle Eingebauter Datentypen.

Konstante Ausdrücke, deren Operanden alle einfache Typkonstanten sind, werden zur Kompilierungszeit ausgewertet. Weitere Informationen finden Sie unter 7.15 Konstante Ausdrücke.

Einfache Typen können mit Literalen initialisiert werden. Zum Beispiel ist 'A' ein Literal des Typs char und 2001 ist ein Literal des Typs int.

    
dtroy 24.11.2009 22:34
quelle

Tags und Links