Variable

Einteilung von Werttypen und Referenztypen

Vordefinierte eingebaute Typen

KategorieEnthaltene Typen
Werttypen (Grundnumerik / Boolean / Zeichen)Ganzzahlen mit Vorzeichen: sbyte, short, int, long
Ganzzahlen ohne Vorzeichen: byte, ushort, uint, ulong
Gleitkomma / Hochgenau: float, double, decimal
Boolean: bool
Zeichen: char
Referenztypen (eingebaute Referenzen)object (Basisklasse aller Typen), string, dynamic

Benutzerdefinierte Typen

KategorieTypen
Werttypenstruct (Struktur), enum (Enumeration)
Referenztypenclass, interface, delegate, array (Array)

Wie im vorherigen Unterricht besprochen, werden Daten von Referenztypen stets auf dem Heap abgelegt. Daten von Werttypen können sich entweder auf dem Heap oder dem Stack befinden.

Der Referenzteil eines Referenztyps kann sowohl auf dem Heap als auch auf dem Stack gespeichert werden.

Ob eine Werttyp-Variable oder die Referenz eines Referenztyps auf Heap oder Stack liegt, hängt davon ab, ob es sich um ein Typmitglied oder eine lokale Variable innerhalb einer Funktion handelt.


Vier Variablenarten

VariablenartDefinition und Zweck
Lokale Variable Local variableTemporäre Daten innerhalb einer Methode, kein Typmitglied;
Gespeichert auf dem Stack
Keine automatische Initialisierung
Feld FieldDaten gebunden an Klasse / Struktur, gehört zu den Typmitgliedern;
Klassenfelder liegen auf dem Heap
Strukturfelder folgen der Speicherlage der Struktur;
Automatisch initialisiert
Parameter ParameterTemporäre Variable für Methodenargumente, kein Typmitglied;
Gespeichert auf dem Stack
Keine automatische Initialisierung
Array-Element Array elementEinzelner Datensatz im Array;
Vollständig auf dem Heap abgelegt
Automatisch initialisiert

Automatische Initialisierung bedeutet, dass der Compiler der Variable einen Standardwert zuweist, auch wenn der Entwickler keinen Anfangswert angibt.

Einfach zusammengefasst

VariablenartSpeicherortAutomatische Initialisierung
Lokale VariableStack / Stack + HeapNein
KlassenfeldHeapJa
StrukturfeldStack / HeapJa
MethodenparameterStackNein
Array-ElementHeapJa

Variablendeklaration

Syntax: Typ Variablenname;

int var2;

Diese Zeile deklariert eine Variable und erledigt zwei wesentliche Aufgaben:

  1. Sie teilt dem Compiler mit, dass var2 eine Variable vom Typ int mit dem Namen var2 ist.
  2. Der Compiler reserviert einen Speicherbereich. Ob der Bereich auf Heap oder Stack liegt, hängt vom Kontext ab: lokale Variable, Parameter, Feld usw.

Variableninitialisierer (Initializer)

Syntax: Typ Variablenname = Anfangswert;

Beispiel: int var2 = 17;

Der Initialisierer ist ein Werkzeug des Compilers zur Variableninitialisierung. Einige Variablen müssen vom Entwickler explizit im Code initialisiert werden, andere können automatisch über den Initialisierer eingerichtet werden.

Nicht initialisierte lokale Variablen haben einen undefinierten Wert, führen zu einem Kompilierfehler und können nicht direkt verwendet werden

Automatisch initialisierte Variablen wie Felder und Array-Elemente erhalten Standardwerte: numerische Typen erhalten 0, Referenztypen erhalten null.

Sehen Sie sich dieses Beispiel an:

class Program
{
    static void Main(string[] args)
    {
        int times = 100;
        Person person = new Person();
    }
}


class Person
{
    public int age;
}   
Code-Sprache: JavaScript (javascript)

In diesem einfachen Beispiel werden innerhalb der Main-Funktion eine Werttyp-Variable times und eine Referenztyp-Variable person angelegt. Der Referenztyp enthält ein Feld age.

age bekommt keinen Anfangswert zugewiesen, times wird manuell initialisiert.

Dieser Code lässt sich fehlerfrei kompilieren.

Wenn wir den Anfangswert 100 von times entfernen und wie folgt schreiben:

Unter der Variable erscheint sofort eine rote Wellenlinie und die Kompilierung schlägt fehl.

Erzwingt man die Kompilierung, werden Fehlermeldungen ausgegeben

Das Fehlerlistenfenster zeigt detaillierte Fehlerinformationen an

Hinweis: Der Fehler tritt nur auf, wenn die Variable times im Code verwendet wird. Wird sie nie aufgerufen, entsteht kein Fehler und der Code kompiliert trotzdem.

class Program
{
    static void Main(string[] args)
    {
        int times;

        Person person = new Person();
    }
}
Code-Sprache: JavaScript (javascript)

Im Gegensatz dazu lassen sich Felder innerhalb eines Typs – wie age in der Klasse Person unten – ohne explizite Initialisierung kompilieren und ausführen.

class Program
{
    static void Main(string[] args)
    {
        int times = 100;
        Console.WriteLine(times);

        Person person = new Person();
        Console.WriteLine(person.age);
    }
}


class Person
{
    public int age;
}   
Code-Sprache: JavaScript (javascript)

Sie sehen die Ausgabe 0. Als Klassenmitglied ohne manuelle Initialisierung erhält age über den Initialisierer einen Standardwert. Der Standardwert von int ist 0; jeder Typ hat einen eigenen Standardwert.

Mehrere Variablen in einer Zeile deklarieren

  1. In einer Zeile dürfen nur Variablen desselben Typs deklariert werden;
  2. Variablennamen werden durch Kommas getrennt; initialisierte und nicht initialisierte Variablen können gemischt werden;
  3. Mehrere Datentypen in einer Zeile zu mischen ist verboten.
// Gültig
int var3 = 7, var4, var5 = 3;
double var6, var7 = 6.52;

// Ungültig! Vermischung von int und float
int var8, float var9;
Code-Sprache: JavaScript (javascript)

Werte von Variablen verwenden

Schreiben Sie einfach den Variablennamen, um den im Speicher abgelegten Wert auszulesen:

Console.WriteLine("{0}", var2);Code-Sprache: JavaScript (javascript)

Variable

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert