Historia pytania
Zmienna lokalna w Visual Basic to zmienna zadeklarowana wewnątrz metody, procedury, pętli lub zagnieżdżonego bloku. Mechanizm zakresu widoczności (scope) był udoskonalany od VB6 do VB.NET, dodawano zasady shadowing oraz ograniczenia w zagnieżdżonych blokach.
Problem
Powszechnym błędem jest deklarowanie zmiennych o tej samej nazwie w zewnętrznym i wewnętrznym bloku, co prowadzi do shadowing i niezamierzonych rezultatów. Nieprawidłowa inicjalizacja takich zmiennych może powodować błędy i obniżać jasność kodu.
Rozwiązanie
Deklaruj zmienne w minimalnie potrzebnym zakresie widoczności. Unikaj shadowing, stosując unikalne nazwy w zagnieżdżonych blokach. W przypadku obszarów o tej samej nazwie (np. "i" w dwóch pętlach) stosuj różne nazwy lub nie przekraczaj pętli.
Przykład kodu:
Sub Demo() Dim value As Integer = 10 If value > 5 Then Dim message As String = "Większe niż pięć" Console.WriteLine(message) End If ' message jest tutaj niedostępna, spowoduje błąd End Sub
Kluczowe cechy:
Co się stanie, jeśli zadeklarujesz zmienną wewnątrz pętli o tej samej nazwie co na zewnątrz?
Zagnieżdżona zmienna maskuje (shadows) zewnętrzną w obrębie bloku. Po zakończeniu bloku zewnętrzny egzemplarz znowu staje się aktualny.
Dim x As Integer = 1 For i = 1 To 2 Dim x As Integer = i * 10 ' shadows external x Console.WriteLine(x) ' 10, potem 20 Next Console.WriteLine(x) ' 1
Jak działa zakres widoczności w przypadku zagnieżdżonych procedur (Sub/Function) w klasie?
Zagnieżdżona procedura ma własny zakres widoczności, nie "widzi" zmiennych zewnętrznych, z wyjątkiem tych, które zostały przekazane jako parametry.
Czy można używać tych samych nazw zmiennych w różnych procedurach?
Tak, to standardowa praktyka. Zmienna lokalna jednej metody nie wpływa na inną, nawet jeśli mają tę samą nazwę.
Deklaracja zmiennej o tej samej nazwie w dwóch zagnieżdżonych blokach, co doprowadziło do zamieszania i błędnych wyników obliczeń.
Zalety:
Wady:
Używanie unikalnych nazw w wewnętrznych blokach, wyraźnie skomentowany zakres każdej zmiennej, brak kolizji nazw.
Zalety:
Wady: