Geschichte des Problems:
Verschachtelte Prozeduren (lokale Funktionen) in Visual Basic wurden erst in den VB.NET-Versionen ab VB 15.0 (Visual Studio 2017) eingeführt, was sie von klassischem VB6 unterscheidet, wo diese Möglichkeit nicht vorhanden war. Diese Funktion ermöglicht es, Prozeduren innerhalb anderer Prozeduren zu deklarieren, was die Ausdruckskraft der Sprache erweitert und die Organisation von Hilfslogik innerhalb eines Sichtbarkeitsbereichs vereinfacht.
Problem
Häufige Situationen, in denen eine bestimmte Hilfslogik nur innerhalb einer spezifischen Methode benötigt wird und nicht anderswo verwendet werden muss. Früher musste man private Methoden der Klasse erstellen, was den Namensraum überlad und die Navigation im Code erschwerte. Aber auch bei lokalen Funktionen kann man auf Sichtbarkeitsprobleme, Zugriffsfehler auf Variablen und Debugging-Schwierigkeiten stoßen.
Lösung
Verschachtelte Prozeduren ermöglichen es, Dienstlogik in der „Eltern“-Prozedur zu kapseln, was den Code lesbarer macht und den Sichtbarkeitsbereich der Hilfsmethoden einschränkt. In VB.NET sieht die Deklaration von verschachtelten Funktionen so aus:
Sub MainProc() Dim x As Integer = 5 Dim y As Integer = 10 Console.WriteLine($"Summe — {Add(x, y)}") Function Add(a As Integer, b As Integer) As Integer Return a + b End Function End Sub
Hauptmerkmale:
Können verschachtelte Prozeduren Zugriffsmodifizierer wie Public, Friend oder Protected haben?
Nein, für verschachtelte Prozeduren ist nur die Zugriffsberechtigung innerhalb ihrer „Eltern“-Prozedur erlaubt. Sie können nicht als Public/Friend/Protected deklariert werden und sind nur lokal verfügbar.
Kann man eine verschachtelte Prozedur innerhalb einer For- oder If-Konstruktion deklarieren?
Nein, lokale Funktionen dürfen nur auf der ersten Ebene innerhalb der Methode (Prozedur) deklariert werden, jedoch nicht innerhalb von verschachtelten Blöcken (z. B. For, If, While).
Können verschachtelte Prozeduren asynchron sein (Async Sub/Function)?
Ja, asynchrone lokale Funktionen können deklariert werden, was es ermöglicht, die Logik der asynchronen Ausführung innerhalb der Methode zu kapseln:
Async Sub DoOperationsAsync() Await LocalAsync() Async Function LocalAsync() As Task Await Task.Delay(1000) Console.WriteLine("Asynchrone Operation abgeschlossen.") End Function End Sub
In einem Projekt wurden private Methoden übermäßig genutzt anstelle von lokalen Funktionen, was dazu führte, dass Dutzende von Dienstprozeduren die Schnittstelle der Klasse „vermüllten“. Die Navigation wurde erheblich erschwert.
Vorteile:
Nachteile:
Für die interne Logik wurde ein Ansatz mit lokalen Funktionen verwendet: die gesamte Dienstverarbeitung wurde innerhalb der Hauptmethode untergebracht, der Code ist selbstdokumentierend und leicht wartbar.
Vorteile:
Nachteile: