Udostępnij za pośrednictwem


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

  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
    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 Ifkonstrukcji ...End If lub For pętli.

  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 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 procedurze show). Zmienna lokalna w tle zmienną numnum na poziomie modułu w programie 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 wewnątrz show 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

  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, 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. Procedura showStrings w klasie pochodnej wyświetla w tle wersję ciągu, gdy nazwa shadowString nie jest kwalifikowana. Następnie wyświetla wersję w tle, gdy shadowString jest kwalifikowana 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 zmiennej w tle. To ryzyko można zmniejszyć, w pełni kwalifikując wszystkie odwołania do zmiennej w tle.

Zobacz też