Übung: Erkunden von Verweistypen
- 8 Minuten
Zu den Verweistypen gehören Arrays, Klassen und Zeichenfolgen. Verweistypen werden in Bezug auf die Art und Weise, wie Werte während der Ausführung der Anwendung gespeichert werden, anders behandelt als Werttypen.
In dieser Übung erfahren Sie, wie sich Verweistypen von Werttypen unterscheiden und wie Sie mit dem Operator new eine Variable mit einem Wert im Speicher des Computers verknüpfen können.
Worin sich Verweistypen von Werttypen unterscheiden
Eine Werttypvariable speichert ihre Werte direkt in einem Speicherbereich, der als Stapel bezeichnet wird. Der Stapel ist der Speicher, der dem Code zugeordnet ist, der aktuell mit der CPU ausgeführt wird (auch bekannt als Stapelrahmen oder Aktivierungsrahmen). Wenn der Stapelrahmen die Ausführung beendet hat, werden die Werte im Stapel entfernt.
Eine Verweistypvariable speichert ihre Werte in einem separaten Speicherbereich, der als Heap bezeichnet wird. Der Heap ist ein Speicherbereich, der von vielen Anwendungen, die gleichzeitig unter dem Betriebssystem ausgeführt werden, gemeinsam verwendet wird. Die .NET-Laufzeit kommuniziert mit dem Betriebssystem, um festzustellen, welche Speicheradressen verfügbar sind, und fordert eine Adresse an, an der sie den Wert speichern kann. Die .NET-Runtime speichert den Wert und gibt dann die Speicheradresse an die Variable zurück. Wenn Ihr Code die Variable verwendet, schlägt die .NET-Runtime die in der Variablen gespeicherte Adresse nahtlos nach und ruft den dort gespeicherten Wert ab.
Als Nächstes schreiben Sie Code, der diese Konzepte deutlicher veranschaulicht.
Definieren einer Verweistypvariable
Verwenden Sie den Operator für Zeilenkommentare
//, um den gesamten Code aus den vorherigen Übungen auszukommentieren bzw. löschen Sie diesen.Aktualisieren Sie Ihren Code im Visual Studio Code-Editor wie folgt:
int[] data;Der folgende Code definiert eine Variable, die einen Wert vom Typ
int-Array speichern kann.An diesem Punkt ist
datalediglich eine Variable, die einen Verweis oder vielmehr eine Speicheradresse eines Werts im Heap enthalten kann. Da diese Variable nicht auf eine Speicheradresse verweist, wird sie als Nullverweis bezeichnet.Erstellen einer Instanz des
int-Arrays mit dem SchlüsselwortnewAktualisieren Sie Ihren Code im Visual Studio Code-Editor, um mithilfe des folgenden Codes eine neue Instanz des
int-Arrays zu erstellen und zuzuweisen:int[] data; data = new int[3];Das Schlüsselwort
newweist die .NET-Runtime an, eine Instanz desint-Arrays zu erstellen und dann zusammen mit dem Betriebssystem festzulegen, dass dieses Array mit einer Größe von drei int-Werten im Arbeitsspeicher gespeichert wird. Die .NET-Runtime führt die gewünschten Schritte aus und gibt eine Speicheradresse des neuenint-Arrays zurück. Schließlich wird die Speicheradresse in den Variablendaten gespeichert. Die Elemente desint-Arrays werden standardmäßig auf den Wert0festgelegt, da dies der Standardwert vonintist.Ändern des Codebeispiels, um beide Vorgänge in einer einzigen Codezeile auszuführen
Die beiden Codezeilen im vorherigen Schritt werden in der Regel auf nur einer Codezeile zusammengefasst, mit der sowohl die Variable deklariert als auch eine neue Instanz des
int-Arrays erstellt wird. Passen Sie den Code aus Schritt 3 folgendermaßen an.int[] data = new int[3];Auch wenn es keine beobachtbare Ausgabe gibt, konnten Sie sich mithilfe dieser Übung hoffentlich mehr Klarheit darüber verschaffen, wie die C#-Syntax mit den Schritten beim Arbeiten mit Verweistypen zusammenhängt.
Welche Unterschiede gibt es zum C#-Datentyp „string“?
Der Datentyp string ist ebenfalls ein Verweistyp. Sie fragen sich vielleicht, warum bei der Deklaration einer Zeichenfolge nicht der Operator new verwendet wird. Dies ist lediglich eine Annehmlichkeit, die durch die Entwickler von C# bereitgestellt wird. Da der Datentyp string so häufig verwendet wird, können Sie dieses Format verwenden:
string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);
Hinter den Kulissen wird jedoch eine neue Instanz von System.String erstellt und mit „Hallo Welt!“ initialisiert.
Praktische Bedenken bei der Verwendung von Wert- und Referenztypen
-
Werttyp (int): In diesem Beispiel sind
val_Aundval_Bganzzahlige Werttypen.
int val_A = 2;
int val_B = val_A;
val_B = 5;
Console.WriteLine("--Value Types--");
Console.WriteLine($"val_A: {val_A}");
Console.WriteLine($"val_B: {val_B}");
Die folgende Ausgabe sollte angezeigt werden:
--Value Types--
val_A: 2
val_B: 5
Wenn val_B = val_A ausgeführt wird, wird der Wert von val_A kopiert und in val_B gespeichert. Wenn val_B also geändert wird, ist val_A nicht betroffen.
-
Verweistyp (Array): In diesem Beispiel sind
ref_Aundref_BArrayverweistypen.
int[] ref_A= new int[1];
ref_A[0] = 2;
int[] ref_B = ref_A;
ref_B[0] = 5;
Console.WriteLine("--Reference Types--");
Console.WriteLine($"ref_A[0]: {ref_A[0]}");
Console.WriteLine($"ref_B[0]: {ref_B[0]}");
Die folgende Ausgabe sollte angezeigt werden:
--Reference Types--
ref_A[0]: 5
ref_B[0]: 5
Wenn ref_B = ref_A ausgeführt wird, verweist ref_B auf denselben Speicherort wie ref_A. Wenn ref_B[0] also geändert wird, ändert sich auch, ref_A[0] da beide auf denselben Speicherort verweisen. Dies ist ein wichtiger Unterschied zwischen Werttypen und Verweistypen.
Zusammenfassung
- Werttypen können kleinere Werte enthalten und werden auf dem Stapel gespeichert. Verweistypen können große Werte enthalten, und eine neue Instanz eines Verweistyps wird mit dem Operator
newerstellt. Verweistypvariablen enthalten einen Verweis (die Speicheradresse) auf den im Heap gespeicherten tatsächlichen Wert. - Zu den Verweistypen gehören Arrays, Zeichenfolge und Klassen.
Überprüfen Sie Ihr Wissen
Feedback
War diese Seite hilfreich?
No
Benötigen Sie Hilfe zu diesem Thema?
Möchten Sie versuchen, Ask Learn zu verwenden, um Sie durch dieses Thema zu klären oder zu leiten?