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?
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
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 vonSystem.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 erbtobject
.
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.)
Nach dem .NET-Reflektor von Red Gate erben sie (indirekt) von einem Objekt.
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;)
-Werttypen erben (indirekt) von Objekt
... aber nicht alles in .net erbt von Objekt .
Werttypen erben auch von Object
, aber nicht direkt. Sie erben von ValueType
, was wiederum Object
erbt.
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.
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.
Tags und Links .net