Udostępnij za pomocą


Jak: Ukryć zmienną o tej samej nazwie co Twoja zmienna (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 w kontekście zakresu. Można przesłonić zmienną w zakresie, ponownie deklarując ją w podregionie regionu, który zawiera 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ą poprzez zasłonięcie jej w obrębie zakresu.

  1. 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 go
    Moduł Klasa w module
    Klasa Podklasa w klasie

    Procedura w klasie

    Nie można ponownie zdefiniować zmiennej procedury w bloku w ramach tej procedury, na przykład w konstrukcji If...End If lub w pętli For.

  2. Utwórz podregion, jeśli jeszcze nie istnieje.

  3. 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 w obrębie zakresu, a także referencję, która omija to 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 procedurze show). Zmienna lokalna num przesłania zmienną na poziomie modułu num w obrębie show, więc zmienna lokalna jest ustawiona na 2. Jednak w procedurze nie ma zmiennej lokalnej do cienia numuseModuleLevelNum . useModuleLevelNum W związku z tym ustawia wartość zmiennej na poziomie modułu na 1.

    Wywołanie MsgBox w ramach show omija mechanizm cieniowania, kwalifikując num przez nazwę 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

  1. 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.

  2. Zdefiniuj klasę pochodzącą z klasy zmiennej, jeśli jeszcze nie istnieje.

  3. 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, jedno, które uzyskuje dostęp do zmiennej przesłaniającej i jedno, które pomija przesłanianie.

    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. Procedura showStrings w klasie pochodnej wyświetla wersję cienującą tego ciągu, gdy nazwa shadowString nie jest w pełni określona. Następnie wyświetla zacienioną wersję, gdy shadowString jest kwalifikowany za pomocą słowa kluczowego MyBase.

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 przysłoniętej zmiennej. Ryzyko to można zmniejszyć, poprzez pełne kwalifikowanie wszystkich odwołań do przesłoniętej zmiennej.

Zobacz także