English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In C# werden die Datentypen nach dem Speichermodus, den sie verwenden, klassifiziert. C# umfasst die folgenden Kategorien von Datentypen:
Wertetypen
Referenztypen
Zeiger-Typen
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 ):
Die folgenden Datentypen sind Wertetypen:
bool
byte
char
decimal
double
enum
float
int
long
sbyte
short
struct
uint
ulong
ushort
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); }
100
200
100
Im obigen Beispiel bleibt der Wert der Variable i unverändert, selbst wenn der Wert im Methodenaufruf ChangeValue() geändert wird.
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.
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
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); }
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.
Der Standardwert null für Referenztypvariablen ist, wenn sie nicht initialisiert sind. Null bezieht sich nicht auf irgendein Objekt.
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.