English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# Werttyp und Referenztyp

In C# werden die Datentypen nach dem Speichermodus, den sie verwenden, klassifiziert. C# umfasst die folgenden Kategorien von Datentypen:

  1. Wertetypen

  2. Referenztypen

  3. Zeiger-Typen

Wertetypen

Wenn ein Datentyp Datenwerte in seinem eigenen Speicherbereich speichert, dann ist er ein Wertetyp. Dies bedeutet, dass die Variablen dieser Datentypen direkt Werte enthalten.

alle Wertetypen vonSystem.ValueTypeabgeleitet, währendSystem.ValueTypewiederum vonSystem.Objectabgeleitet.

Zum Beispiel, die Ganzzahl-Variable int i = 100;

Das System speichert100 wird im für die Variable i zugewiesenen Speicherplatz gespeichert. Das Diagramm zeigt, wie100 wird im Speicher von "i" (0x239110eine Annahmeposition in ):

Speicherzuweisung von Wertetyp- Variablen

Die folgenden Datentypen sind Wertetypen:

  • bool

  • byte

  • char

  • decimal

  • double

  • enum

  • float

  • int

  • long

  • sbyte

  • short

  • struct

  • uint

  • ulong

  • ushort

Übergabe von Wertetyp- Variablen

  Wenn Sie eine Wertetyp- Variable von einer Methode an eine andere Methode weitergeben, erstellt das System im anderen Methoden eine separate Kopie der Variable. Wenn Sie den Wert in einer Methode ändern, beeinflusst dies nicht die Variable in der anderen Methode.

static void ChangeValue(int x)
{
    x =  200;
    Console.WriteLine(x);
}
static void Main(string[] args)
{
    int i = 100;
    Console.WriteLine(i);
    
    ChangeValue(i);
    
    Console.WriteLine(i);
}
Ausgabe:

100
200
100

Im obigen Beispiel bleibt der Wert der Variable i unverändert, selbst wenn der Wert im Methodenaufruf ChangeValue() geändert wird.

Referenztypen

Im Gegensatz zu Wertetypen speichern Referenztypen nicht direkt ihren Wert. Stattdessen speichern sie die Adresse des Speicherorts, an dem der Wert gespeichert wird. Mit anderen Worten, Referenztypen enthalten einen Zeiger auf einen anderen Speicherort, an dem Daten gespeichert werden.

Beispielsweise die folgenden String- Variablen:

string s = "Hello World!!";

Das folgende Bild zeigt, wie das System Speicher für die oben genannten String- Variablen zuweist.

Speicherzuweisung von Referenztyp- Variablen

Wie im obigen Bild gezeigt, wählt das System eine zufällige Position im Speicher (0x803200). Der Wert der Variable s ist 0x600000, dies ist die tatsächliche Speicheradresse des Datenwerts. Daher speichern Referenztypen die Adresse des Speicherorts, an dem der tatsächliche Wert gespeichert ist, nicht den Wert selbst.

Hier sind die Referenztyp-Datentypen:

  • Strings

  • Array (selbst wenn ihre Elemente Wertetypen sind)

  • Klassen

  • Delegaten

Übergabe von Referenztyp- Variablen

Wenn Sie einen Referenztyp- Variable von einer Methode an eine andere Methode weitergeben, wird keine neue Kopie erstellt; im Gegenteil wird die Adresse der Variable übergeben. Daher wird sich der Wert der Variable auch in der aufgerufenen Methode ändern, wenn wir den Wert in der Methode ändern.

static void ChangeReferenceType(Student std2)
{
    std2.StudentName = "Steve";
}
static void Main(string[] args)
{
    Student std1 = new Student();
    std1.StudentName = "Bill";
    
    ChangeReferenceType(std1);
    Console.WriteLine(std1.StudentName);
}
Ausgabe:
Steve

Im obigen Beispiel werden wir das Student-Objekt std1 Übergabe an die Methode ChangeReferenceType(). Hier wird sie tatsächlich std1die Speicheradresse. Daher ändert der ChangeReferenceType()-Method实际上,当更改StudentName时,es ändert std1des StudentName-Objekts, weil std1und std2weisen alle auf denselben Speicherort im Speicher hin.

Null-Wert

  Der Standardwert null für Referenztypvariablen ist, wenn sie nicht initialisiert sind. Null bezieht sich nicht auf irgendein Objekt.

Leere Referenztypen

Werttypvariablen können null nicht sein, da sie Werte und nicht Speicheradressen speichern. C#2.0 führte leere Typen ein, mit denen es möglich ist, Werttypvariablen null zuzuweisen oder Werttypvariablen zu deklarieren, ohne ihnen einen Wert zuzuweisen.