Geschiedenis van de vraag
Lokale variabelen in Visual Basic zijn variabelen die zijn gedefinieerd binnen een methode, procedure, lus of genest blok. Het mechanisme van scope is verbeterd van VB6 naar VB.NET, er zijn regels voor shadowing toegevoegd en beperkingen voor geneste blokken.
Probleem
Een veelvoorkomende fout is het definiëren van variabelen met dezelfde naam in het externe en interne blok, wat leidt tot shadowing en onverwachte resultaten. Onjuiste initialisatie van zulke variabelen kan bugs veroorzaken en de duidelijkheid van de code verminderen.
Oplossing
Definieer variabelen in de minimaal benodigde scope. Vermijd shadowing, gebruik unieke namen in geneste blokken. Voor scopes met dezelfde naam (bijvoorbeeld "i" in twee lussen) gebruik verschillende namen of kruis de lussen niet.
Codevoorbeeld:
Sub Demo() Dim value As Integer = 10 If value > 5 Then Dim message As String = "Groter dan vijf" Console.WriteLine(message) End If ' message is hier niet toegankelijk, zal een fout veroorzaken End Sub
Belangrijke kenmerken:
Wat gebeurt er als je een variabele binnen een lus declareert met dezelfde naam als erbuiten?
De geneste variabele verbergt (shadows) de externe binnen het blok. Na het einde van het blok wordt de externe instantie weer relevant.
Dim x As Integer = 1 For i = 1 To 2 Dim x As Integer = i * 10 ' shadows externe x Console.WriteLine(x) ' 10, dan 20 Next Console.WriteLine(x) ' 1
Hoe werkt de scope in het geval van geneste procedures (Sub/Function) in een klasse?
Een geneste procedure heeft zijn eigen scope; deze "ziet" geen externe variabelen, behalve die welke als parameters zijn doorgegeven.
Mag ik dezelfde variabele namen gebruiken in verschillende procedures?
Ja, dat is gebruikelijk. Een lokale variabele van de ene methode heeft geen invloed op een andere, zelfs niet met dezelfde naam.
Definiëren van een variabele met dezelfde naam binnen twee geneste blokken, wat leidde tot verwarring en incorrecte rekenresultaten.
Voordelen:
Nadelen:
Gebruik van unieke namen in interne blokken, duidelijke geannoteerde scope voor elke variabele, afwezigheid van overlappende namen.
Voordelen:
Nadelen: