Der Stack und was beim Methodenaufruf passiert

Der Stack und was beim Methodenaufruf passiert

Von Jan Suchotzki

Schau dir auch die weiteren Folgen des C# Tutorial Deutsch an.

Den Teilnehmern meines Kurses “Einstieg in C# - Software programmieren wie ein Profi” biete ich die Aktion #FragLernMoment an. Das bedeutet, dass sie im Diskussionsforum eine Frage stellen können. Diese beantworte ich natürlich schriftlich, aber jede Woche gebe ich die Antwort zu einer Frage auch per Video.

Diese Folge des C# Tutorial Deutsch ist genau solch ein Video. Darin erkläre ich dir (sehr anschaulich ;) was der Stack ist und was er mit einem Methodenaufruf zutun hat. Die Frage dazu kam von einem Kursteilnehmer der zwar Methoden allgemein verstanden hatte sich aber nicht bildlich vorstellen konnte wie das mit der Wertübergabe und Rückgabe zur Laufzeit funktioniert.

Alles weitere erfährst du hier im Video:

Was ist ein Stack?

Im Bereich von Algorithmen und Datenstrukturen, einem Teilgebiet der Informatik, wird ein Stack häufig mit Keller übersetzt. Du kannst Elemente von oben in den Keller legen und musst immer das zuletzt reingelegte zu erst raus nehmen.

Im Speichermanagement von .NET wird ein Stack verwendet um zur Laufzeit lokale Daten einer Methode zu speichern. Dabei bekommt jeder Methodenaufruf seinen eigenen Stack-Frame. In diesem Container legt die Laufzeitumgebung von .NET dann die ganzen Werte von Variablen ab.

Die allgemeine Funktionsweise eines Stack ist sehr gut auf Wikipedia erklärt.

Warum braucht ein Methodenaufruf einen Stack-Frame?

Alles was in einer Methode lokal verwendet wird, wird lediglich während der Ausführung dieser Methode benötigt. Es ist allerdings möglich, dass eine Methode unterbrochen wird, weil sie eine andere Methode aufruft. Wenn dies geschieht, müssen alle Werte so wie sie momentan in der aufrufenden Methode sind gesichert werden.

Die aufgerufene Methode ihrerseits braucht allerdings auch einen Bereich wo ihre Werte gespeichert werden. Somit wird für jede Methode einfach ein Stack-Frame angelegt und auf den Stack gelegt. Ist diese Methode nun abgearbeitet, dann werden auch alle ihre lokalen Variablen gelöscht, denn diese werden später nie wieder gebraucht.

Damit lässt sich auch sehr anschaulich erklären warum zwei Methodenaufrufe (der gleichen Methode) komplett unabhängig sind. Es wird zwar immer der gleiche Quellcode ausgeführt, aber die Daten mit denen die Methode arbeitet sind jedesmal “neu”, weil mit jedem Aufruf der Methode ein neuer Stack-Frame angelegt wird. Das kann übrigens sehr häufig passieren, wenn eine Methode in einer Schleife (z.B. foreach) ausgeführt wird.

Eine geniale Beschreibung von Stack und vielen weiteren Teilen des .NET Speichermanagements sind im (nur auf Englisch verfügbaren) Artikel “.NET Memory Management Basics” beschrieben. Wenn dich das Thema interessiert und du ein wenig Englisch kannst, dann solltest du den Artikel unbedingt lesen.

Auch wenn ich im Quellcode zu diesem Video nichts besonderes gemacht habe, kannst du ihn hier anschauen falls du etwas ausprobieren möchtest.

Viel Erfolg mit den nächsten Methodenaufrufen

Jan