Achtergrond van de kwestie:
Geneste procedures (lokale functies) in Visual Basic zijn geïntroduceerd met VB.NET versies vanaf VB 15.0 (Visual Studio 2017), wat ze onderscheidt van klassiek VB6, waar deze mogelijkheid niet bestond. Deze functie maakt het mogelijk om procedures binnen andere procedures te declareren, waardoor de expressiviteit van de taal wordt vergroot en de organisatie van hulplogica binnen één zichtbaarheidsscope wordt vereenvoudigd.
Probleem
Er zijn vaak situaties waarin bepaalde hulplogica alleen nodig is binnen een specifieke methode en nergens anders. Vroeger moest men privé-methoden van de klasse maken, wat leidde tot vervuiling van de naamruimte en de navigatie door de code bemoeilijkte. Maar ook bij lokale functies kan men problemen tegenkomen met zichtbaarheid, toegang tot variabelen en foutopsporing.
Oplossing
Geneste procedures maken het mogelijk om service-logica in de “bovenliggende” procedure te encapsuleren, waardoor de code leesbaarder wordt en de zichtbaarheid van hulpmethoden wordt beperkt. In VB.NET ziet de declaratie van geneste functies er als volgt uit:
Sub MainProc() Dim x As Integer = 5 Dim y As Integer = 10 Console.WriteLine($"Som — {Add(x, y)}") Function Add(a As Integer, b As Integer) As Integer Return a + b End Function End Sub
Belangrijkste kenmerken:
Kunnen geneste procedures toegangsmathers Public, Friend of Protected hebben?
Nee, voor geneste procedures is alleen de toegankelijkheid binnen hun “bovenliggende” procedure toegestaan. Ze kunnen niet worden gedeclareerd als Public/Friend/Protected en zijn alleen lokaal toegankelijk.
Kan een geneste procedure worden gedeclareerd binnen een For- of If-constructie?
Nee, lokale functies mogen alleen op het eerste niveau binnen een methode (procedure) worden gedeclareerd, maar niet binnen geneste blokken (bijv. For, If, While).
Kunnen geneste procedures asynchroon zijn (Async Sub/Function)?
Ja, je kunt asynchrone lokale functies declareren, wat het mogelijk maakt om de logica van asynchrone uitvoering binnen een methode te encapsuleren:
Async Sub DoOperationsAsync() Await LocalAsync() Async Function LocalAsync() As Task Await Task.Delay(1000) Console.WriteLine("Asynchrone bewerking voltooid.") End Function End Sub
In het project werden privé-methoden overmatig gebruikt in plaats van lokale functies, waardoor tientallen serviceprocedures de interface van de klasse “vervuilden”. Navigatie werd sterk bemoeilijkt.
Voordelen:
Nadelen:
Voor interne logica werd de aanpak met lokale functies gebruikt: alle serviceverwerking is binnen de hoofdprocedure geplaatst, de code is zelf-documenterend en gemakkelijk te onderhouden.
Voordelen:
Nadelen: