Postupy: Skrytí proměnné se stejným názvem jako má vaše proměnná (Visual Basic)

Proměnnou můžete skrýt tak, že ji stíníte . To znamená, že ji znovu nadefinujete s proměnnou se stejným názvem. Proměnnou, kterou chcete skrýt, můžete stínovat dvěma způsoby:

  • Stínování prostřednictvím oboru Můžete ho stínovat prostřednictvím oboru tím, že ho předefinujete v podregionu oblasti obsahující proměnnou, kterou chcete skrýt.

  • Stínování prostřednictvím dědičnosti Pokud je proměnná, kterou chcete skrýt, definována na úrovni třídy, můžete ji stínovat prostřednictvím dědičnosti tím, že ji předefinujete pomocí klíčového slova Shadows v odvozené třídě.

Dva způsoby skrytí proměnné

Skrytí proměnné jeho stínováním prostřednictvím oboru

  1. Určete oblast definující proměnnou, kterou chcete skrýt, a určete podoblast, ve které chcete předefinovat proměnnou.

    Oblast proměnné Povolitelnou podoblast pro jeho předdefinování
    Modul Třída v rámci modulu
    Třída Podtřída v rámci třídy

    Procedura v rámci třídy

    Proměnnou procedury v bloku v rámci tohoto postupu nelze předefinovat, například ve Ifkonstrukci ...End If nebo smyčce For .

  2. Vytvořte podoblast, pokud ještě neexistuje.

  3. V podregionu napište příkaz Dim deklarující proměnnou stínování.

    Když kód uvnitř podregionu odkazuje na název proměnné, kompilátor přeloží odkaz na stínovací proměnnou.

    Následující příklad znázorňuje stínování prostřednictvím oboru a také odkaz, který obchází stínování.

    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
    

    Předchozí příklad deklaruje proměnnou num na úrovni modulu i na úrovni procedury (v postupu show). Místní proměnná num stínuje proměnnou num na úrovni modulu v rámci show, takže místní proměnná je nastavená na hodnotu 2. V postupu však neexistuje žádná místní proměnná pro stín numuseModuleLevelNum . useModuleLevelNum Proto nastaví hodnotu proměnné na úrovni modulu na 1.

    Volání MsgBox uvnitř show obchází mechanismus stínování tím, že se kvalifikuje num s názvem modulu. Proto místo místní proměnné zobrazí proměnnou na úrovni modulu.

Skrytí proměnné stínováním prostřednictvím dědičnosti

  1. Ujistěte se, že proměnná, kterou chcete skrýt, je deklarována ve třídě a na úrovni třídy (mimo jakoukoli proceduru). Jinak ho nemůžete stínovat prostřednictvím dědičnosti.

  2. Definujte třídu odvozenou z třídy proměnné, pokud ještě neexistuje.

  3. Uvnitř odvozené třídy napište Dim příkaz deklarující proměnnou. Do deklarace zahrňte klíčové slovo Shadows.

    Pokud kód v odvozené třídě odkazuje na název proměnné, kompilátor přeloží odkaz na vaši proměnnou.

    Následující příklad znázorňuje stínování prostřednictvím dědičnosti. Vytváří dva odkazy, jeden, který přistupuje k proměnné stínování, a druhý, který obchází stínování.

    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
    

    Předchozí příklad deklaruje proměnnou shadowString v základní třídě a stínuje ji v odvozené třídě. Procedura showStrings v odvozené třídě zobrazí stínovací verzi řetězce, pokud název shadowString není kvalifikovaný. Potom zobrazí stínovou verzi, pokud shadowString je kvalifikována pomocí klíčového MyBase slova.

Robustní programování

Stínování zavádí více než jednu verzi proměnné se stejným názvem. Pokud příkaz kódu odkazuje na název proměnné, verze, na kterou kompilátor přeloží odkaz, závisí na faktorech, jako je umístění příkazu kódu a přítomnost opravňujícího řetězce. To může zvýšit riziko odkazování na nezamýšlenou verzi stínované proměnné. Toto riziko můžete snížit tak, že plně opravníte všechny odkazy na stínovanou proměnnou.

Viz také