Porady: ukrywanie zmiennej o tej samej nazwie jako zmiennej użytkownika (Visual Basic)
Zmienną można ukryć, cieniując ją, czyli przez ponowne zdefiniowanie jej za pomocą zmiennej o tej samej nazwie. Zmienną, którą chcesz ukryć, można ukryć na dwa sposoby:
Cieniowanie przez zakres. Zakres można ukryć, ponownie deklarując go w podregionie regionu zawierającego zmienną, którą chcesz ukryć.
Cieniowanie przez dziedziczenie. Jeśli zmienna, którą chcesz ukryć, jest zdefiniowana na poziomie klasy, można ją zaciemnić przez dziedziczenie, ponownie deklarując je za pomocą słowa kluczowego Shadows w klasie pochodnej.
Dwa sposoby ukrywania zmiennej
Aby ukryć zmienną przez cieniowanie jej przez zakres
Określ region definiujący zmienną, którą chcesz ukryć, i określ podregion, w którym należy ponownie zdefiniować zmienną.
Region zmiennej Dozwolony podregion do ponownego zdefiniowania Moduł Klasa w module Klasa Podklasa w klasie
Procedura w klasieNie można ponownie zdefiniować zmiennej procedury w bloku w ramach tej procedury, na przykład w
If
konstrukcji ...End If
lubFor
pętli.Utwórz podregion, jeśli jeszcze nie istnieje.
W podregionie napisz instrukcję Dim deklarując zmienną cieniowania.
Gdy kod wewnątrz podregionu odwołuje się do nazwy zmiennej, kompilator rozpoznaje odwołanie do zmiennej cieniowania.
Poniższy przykład ilustruje cieniowanie przez zakres, a także odwołanie, które pomija cieniowanie.
Module shadowByScope ' The following statement declares num as a module-level variable. Public num As Integer Sub show() ' The following statement declares num as a local variable. Dim num As Integer ' The following statement sets the value of the local variable. num = 2 ' The following statement displays the module-level variable. MsgBox(CStr(shadowByScope.num)) End Sub Sub useModuleLevelNum() ' The following statement sets the value of the module-level variable. num = 1 show() End Sub End Module
Powyższy przykład deklaruje zmienną
num
zarówno na poziomie modułu, jak i na poziomie procedury (w procedurzeshow
). Zmienna lokalna w tle zmiennąnum
num
na poziomie modułu w programieshow
, więc zmienna lokalna jest ustawiona na 2. Jednak w procedurze nie ma zmiennej lokalnej do cienianum
useModuleLevelNum
.useModuleLevelNum
W związku z tym ustawia wartość zmiennej na poziomie modułu na 1.Wywołanie
MsgBox
wewnątrzshow
pomija mechanizm cieniowania, kwalifikując sięnum
do nazwy modułu. W związku z tym wyświetla zmienną na poziomie modułu zamiast zmiennej lokalnej.
Aby ukryć zmienną, cieniując ją przez dziedziczenie
Upewnij się, że zmienna, którą chcesz ukryć, jest zadeklarowana w klasie i na poziomie klasy (poza dowolną procedurą). W przeciwnym razie nie można go zaciemnić za pośrednictwem dziedziczenia.
Zdefiniuj klasę pochodzącą z klasy zmiennej, jeśli jeszcze nie istnieje.
Wewnątrz klasy pochodnej napisz instrukcję deklarując zmienną
Dim
. Dołącz słowo kluczowe Shadows do deklaracji .Gdy kod w klasie pochodnej odwołuje się do nazwy zmiennej, kompilator rozpoznaje odwołanie do zmiennej.
Poniższy przykład ilustruje cieniowanie przez dziedziczenie. Tworzy dwa odwołania, jeden, który uzyskuje dostęp do zmiennej cieniowania i jeden, który pomija cieniowanie.
Public Class shadowBaseClass Public shadowString As String = "This is the base class string." End Class Public Class shadowDerivedClass Inherits shadowBaseClass Public Shadows shadowString As String = "This is the derived class string." Public Sub showStrings() Dim s As String = "Unqualified shadowString: " & shadowString & vbCrLf & "MyBase.shadowString: " & MyBase.shadowString MsgBox(s) End Sub End Class
Powyższy przykład deklaruje zmienną
shadowString
w klasie bazowej i cieniuje ją w klasie pochodnej. ProcedurashowStrings
w klasie pochodnej wyświetla w tle wersję ciągu, gdy nazwashadowString
nie jest kwalifikowana. Następnie wyświetla wersję w tle, gdyshadowString
jest kwalifikowana za pomocą słowa kluczowegoMyBase
.
Niezawodne programowanie
Funkcja cieniowania wprowadza więcej niż jedną wersję zmiennej o tej samej nazwie. Gdy instrukcja kodu odwołuje się do nazwy zmiennej, wersja, do której kompilator rozpoznaje odwołanie, zależy od czynników, takich jak lokalizacja instrukcji kodu i obecność ciągu kwalifikującego. Może to zwiększyć ryzyko odwoływania się do niezamierzonej wersji zmiennej w tle. To ryzyko można zmniejszyć, w pełni kwalifikując wszystkie odwołania do zmiennej w tle.