Dieses Thema wurde bereits in früheren Lektionen angesprochen. Wir vertiefen das Verständnis nun anhand der Speichernutzung im Arbeitsspeicher.
Dieses Tutorial stammt von foxdevelop.com. Bitte geben Sie die Quelle bei einer Weiterverbreitung an.
Innerhalb eines Methodenrumpfs können weitere Codeblöcke verschachtelt werden.
class Program
{
static void Main()
{
int age = 19;
{
int one = 23;
}
}
}
Code-Sprache: C# (cs)

Die Anzahl der Codeblöcke ist nicht begrenzt. Sie können nacheinander angeordnet oder beliebig tief verschachtelt werden.
class Program
{
static void Main()
{
int age = 19;
{
int one = 23;
{
int two = 45;
{
int three = 56;
}
}
}
}
}Code-Sprache: C# (cs)

Achten Sie darauf: Anweisungen wie int xxxx = xxx; oberhalb eines untergeordneten verschachtelten Blocks laufen parallel zu diesem Block.

Beispielsweise sind int age = 19; und der darunterliegende verschachtelte Codeblock zwei voneinander unabhängige Anweisungen. Verwechseln Sie diesen Aufbau nicht mit einem Methodenrumpf.
Lebenszyklus
Sehen wir uns ein Beispiel an
static void Main()
{
int a = 10;
{
int b = 20;
}
}Code-Sprache: C# (cs)
In diesem Beispiel gibt es zwei lokale Variablen. Die äußere Variable a gehört zum äußeren Bereich der Main-Funktion, b zum inneren verschachtelten Block.
Wir gehen die Ausführung Schritt für Schritt durch und beobachten die Verwaltung des Stapelspeichers.

Schritt 1: Es wird nur int a = 10; ausgeführt. Auf dem Stack wird Speicher für a reserviert und der Wert 10 gespeichert;
Schritt 2: Der innere Block wird betreten und int b = 20; ausgeführt. Der Stack erhält einen Eintrag für b. Von oben nach unten: b, a;
Schritt 3: Der innere Codeblock ist abgearbeitet. b wird vom Stack entfernt, nur a bleibt übrig.
Schritt 4: Die Main-Methode ist beendet. a wird ebenfalls vom Stack entfernt, alle Variablen des Programms werden gelöscht und das Programm endet.
Zusammenfassung
Variablen, die innerhalb eines verschachtelten Blocks deklariert werden, beginnen ihren Lebenszyklus an der Deklarationsstelle und enden mit dem Abschluss des umschließenden Codeblocks.
Sobald ein verschachtelter Block seine Ausführung beendet, werden alle darin definierten lokalen Variablen vom Stack entfernt und vernichtet.
Ein Methodenrumpf ist im Grunde ebenfalls ein großer Codeblock.
Gültigkeitsbereich (Scope)
Solange der Gültigkeitsbereich einer vorhandenen Variable aktiv ist, darf keine weitere lokale Variable mit gleichem Namen deklariert werden – unabhängig von der Verschachtelungstiefe.
Schauen wir uns ein Beispiel an
static void Main()
{
int a = 10;
{
int a = 20;
}
}Code-Sprache: C# (cs)

In diesem Code hat die Variable a im inneren Block denselben Namen wie die äußere Variable a. Das führt zu einem Fehler, die Kompilierung schlägt fehl.
Der Grund: Der Gültigkeitsbereich von int a = 10; erstreckt sich über die umschließenden geschweiften Klammern. Innerhalb dieses Bereichs sind doppelte Variablennamen unzulässig. Auch wenn int a = 20; in einem verschachtelten Block steht, liegt dieser Block im Gültigkeitsbereich der äußeren Variable. Der Compiler erkennt den Namenskonflikt und markiert die Zeile mit einer roten Wellenlinie.
Diese Regel gilt auch dann, wenn der zweite Variablenname einen anderen Datentyp erhält.

Innerhalb eines gemeinsamen Gültigkeitsbereichs müssen Variablennamen eindeutig sein; der Datentyp spielt dabei keine Rolle.

Auf der Abbildung ist der Gültigkeitsbereich der äußeren Variable a gelb markiert, der der inneren Variable a grün. Man erkennt deutlich, dass der äußere Bereich den inneren vollständig einschließt und so der Konflikt entsteht.
Die Lösung ist einfach: Benennen Sie die innere Variable a um.

Hier ist ein weiteres Beispiel
Kommt es bei folgender Schreibweise zu einem Namenskonflikt?
class Program
{
static void Main()
{
int a = 10;
{
double b = 20;
}
{
double b = 30;
}
}
}Code-Sprache: C# (cs)
Die Antwort lautet nein. Obwohl zwei Variablen namens b existieren, überlappen sich ihre Gültigkeitsbereiche nicht, daher läuft die Kompilierung fehlerfrei ab. Das erste b gilt nur in seinem eigenen Block, das zweite b in einem separaten Block. Sehen Sie sich die Abbildung an.

Die farbigen Bereiche zeigen jeweils den Gültigkeitsbereich der Variablen b. Hoffentlich ist der Sachverhalt nun verständlich.
Verschachtelte Codeblöcke und Variablen-Gültigkeitsbereiche