Kann eine Struktur von einer Klasse in c # abgeleitet werden?
Wenn nicht, warum können primitive Datentypen wie int von der Klasse object
abgeleitet werden? Da der Datentyp int grundsätzlich ein Strukturtyp (Werttyp) ist.
Ist das nur eine Ausnahme von der Regel?
Ganzzahlen und andere Werttypen (z. B. bool) sind Objekte, weil sie ihnen die Vererbung ermöglichen (d. h. sie haben Zugriff auf die allgemeinen Funktionen .Equals()
, .GetType()
, .ToString()
).
Es ist eine Designentscheidung im .NET Framework. Anstatt separate Funktionen für alle Werttypen unter System.ValueType zu schreiben, verwenden sie eine gemeinsame Codebasis.
Wenn die Laufzeit einen Speicherort für einen Typ zuweist oder einen Code für einen Typ generiert, prüft dieser, ob der Typ von System.ValueType
abgeleitet ist, aber nicht von System.ValueType
selbst. Sofern der Speicherort diese Kriterien nicht erfüllt, enthält er einen Heap-Objektreferenz, und jeder Code, der auf seinen Membern ausgeführt wird (Felder, Methoden, Eigenschaften usw.), wirkt auf das referenzierte Objekt. Andernfalls enthält der Speicherort alle öffentlichen und privaten Felder dieses Typs (die an allen Speicherorten dieses Typs identisch angeordnet sind), und jeder Code, der für seine Mitglieder verwendet werden soll, wird auf dem Speicherort selbst ausgeführt.
Wenn versucht wird, einen Werttyp in einen Speicherort der Klasse ValueType
oder einen Speicherort zu speichern, der nicht von ValueType
abgeleitet ist, generiert das System ein neues Heap-Objekt vom Typ des Speicherortes. und speichern Sie dann einen Verweis auf das Objekt an dem entsprechenden Speicherort. Obwohl Speicherorte von Typen, die von System.ValueType
abgeleitet sind, und Code für den Zugriff auf sie speziell von der Laufzeit behandelt werden, sind Heap-Objektinstanzen, die von System.ValueType
erben (wie der eben erwähnte neu erstellte), einfach Heap-Objekte Diese stammen von System.ValueType
und weisen Vererbungsverhalten auf, das im Wesentlichen mit anderen Typen identisch ist und daher von Code weitergegeben werden kann, der mit Heap-Referenzen umgehen soll.
Eine Aussage wie Object Foo = New System.Drawing.Point(3,4);
beinhaltet tatsächlich drei Arten von Dingen:
Daraus ergibt sich, dass Werttypen als Erben von ValueType
definiert werden können, das von Object
erbt, und während Heap-Objekte, deren Typen von ValueType
erben, von Object
, , erben Speicherorte von Werttypen enthalten keine Objekte, die von Object
erben.
Die Klassenhierarchie funktioniert wie folgt (vereinfacht):
Objekt - & gt; Werttyp - & gt; int Objekt - & gt; Werttyp - & gt; Struktur
Strukte nach Definition von c # erlauben keine Vererbung.
Hier ist ein schöner Artikel, der die Rolle von Stucts in der C # -Sprache beschreibt: