Heim  >  Artikel  >  Backend-Entwicklung  >  Vergleichen Sie die Unterschiede zwischen Werttypen und Referenztypen in C#

Vergleichen Sie die Unterschiede zwischen Werttypen und Referenztypen in C#

巴扎黑
巴扎黑Original
2017-09-06 11:13:441584Durchsuche

CLR unterstützt zwei Typen: Werttypen und Referenztypen. Es scheint, dass die meisten Typen in FCL Referenztypen sind, aber die am häufigsten verwendeten Typen sind Werttypen. Referenztypen werden immer vom verwalteten Heap zugewiesen. Wenn ein Objekt mit dem neuen Operator instanziiert wird, wird die zurückgegebene Objektspeicheradresse in einer Variablen gespeichert. Bei der Verwendung von Referenztypen sind vier psychologische Faktoren zu verstehen:

1. Speicher muss vom verwalteten Heap zugewiesen werden

2. Jedes auf dem Heap zugewiesene Objekt verfügt über einige zusätzliche Mitglieder, diese Mitglieder müssen vor der Verwendung initialisiert werden.

3. Andere Bytes im Objekt werden immer auf Null gesetzt.

4. Bei der Zuweisung von Objekten aus dem verwalteten Heap kann eine Garbage Collection erzwungen werden.

Es ist ersichtlich, dass der Missbrauch von Referenztypen unweigerlich zu einer Überlastung führt. Betrachtet man den Werttyp noch einmal, handelt es sich um einen leichtgewichtigen Typ. Er wird im Allgemeinen auf dem Thread-Stack zugewiesen und kann auch in ein Referenztypobjekt eingebettet werden. Die Variable, die ihn trägt, enthält natürlich keinen Zeiger auf die Instanz nicht vom Garbage Collector gesteuert, daher verringert der Wert die Verwendung von Typen den Druck auf den verwalteten Heap und verringert die Anzahl der Garbage Collections während der Anwendungslebensdauer.

  Was in C# als „Klassen“ bezeichnet wird, sind Referenztypen, während Werttypen Strukturen oder Aufzählungen sind. Alle Strukturen werden direkt vom abstrakten Typ System.ValueType abgeleitet. Und es selbst ist direkt von Object abgeleitet, alle Aufzählungen sind vom abstrakten Typ System.Enum abgeleitet, und Enum ist von ValueType abgeleitet, und sie sind alle miteinander verknüpft.

Wenn Sie Ihren eigenen Typ entwerfen, wann definieren Sie ihn als Werttyp?

1. Der Typ hat das Verhalten eines primitiven Typs (Datentyp, der direkt vom Compiler unterstützt wird (wie Int32, Int64 usw.))

2. Der Typ muss nicht erben von jedem anderen Typ.

3. Der Typ leitet keine anderen Typen ab.

4. Da der Werttyp bei Verwendung als tatsächlicher Parameter oder Rückgabewert die entsprechenden Felder kopieren muss, führt eine zu große Instanz zu einem gewissen Leistungsverlust.

Daher muss die Typinstanz klein sein (innerhalb von 16 Bytes) und die Instanz größer sein, es ist jedoch nicht erforderlich, sie als tatsächlichen Parameter der Methode zu übergeben und von der Methode zurückzugeben.

Bezüglich des Unterschieds zwischen Werttypen und Referenztypen sind hier einige Punkte:

1. Referenztypen sind in Boxform und Werttypen in Unboxed-Form. Beide können auch verwendet werden . Auf bestimmte Weise ineinander konvertieren (spezifische Anweisungen werden im nächsten Blog ausführlich besprochen)

  2. Werttypen sollten keine neuen virtuellen Methoden einführen. Alle Methoden können nicht abstrakt sein und sind implizit. Umschreiben verhindern.

3. Durch das Zuweisen einer Werttypvariablen zu einer anderen Werttypvariablen wird ein feldweises Kopieren durchgeführt. Beim Zuweisen einer Variablen vom Referenztyp zu einem anderen Referenztyp wird nur die Speicheradresse kopiert. Zwei oder mehr Referenztypvariablen können auf dasselbe Objekt im Heap verweisen, und an einer Variablen ausgeführte Operationen können sich auf das Objekt auswirken, auf das eine andere Variable verweist. Im Gegensatz dazu sind Werttypvariablen unabhängig und beeinflussen sich nicht gegenseitig.

 4. Unboxed-Werttypen werden nicht auf dem Heap zugewiesen. Sobald also eine Instanz dieses Typs nicht mehr aktiv ist, wird der für sie zugewiesene Speicher freigegeben und wartet nicht auf die Speicherbereinigung

Das obige ist der detaillierte Inhalt vonVergleichen Sie die Unterschiede zwischen Werttypen und Referenztypen in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn