kann eine Struktur von einer Klasse in c # abgeleitet werden?

8

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?

    
Nithish Inpursuit Ofhappiness 04.12.2012, 17:05
quelle

4 Antworten

9

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.

Microsoft's Dokument zu Typen

    
Alexander Matusiak 04.12.2012, 17:14
quelle
7

Alle Strukturen erben System.ValueType , was wiederum Object erbt.

Sie können das nicht ändern.

    
SLaks 04.12.2012 17:06
quelle
1

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:

  1. Ein unbenannter temporärer Speicherort des Typs 'System.Drawing.Point (3,4)', der die privaten Felder dieses Typs (zwei Ganzzahlen) enthält und auf (3,4) initialisiert wird. Beachten Sie, dass dieser Speicherort kein "Objekt" enthält. es enthält zwei Ganzzahlen, von denen der Compiler weiß, dass sie seine Felder repräsentieren.
  2. Ein Heap-Objekt vom Typ 'System.Drawing.Point'. Da dies ein Heap-Objekt ist, erbt es von "System.Object", wie alle Heap-Objekte.
  3. Ein Speicherort vom Typ 'Object', der durch den Variablennamen 'Foo' repräsentiert wird.

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.

    
supercat 04.12.2012 18:59
quelle
0

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:

Ссылка

    
Nathan Tregillus 04.12.2012 17:15
quelle

Tags und Links