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
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řídyProměnnou procedury v bloku v rámci tohoto postupu nelze předefinovat, například ve
If
konstrukci ...End If
nebo smyčceFor
.Vytvořte podoblast, pokud ještě neexistuje.
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 postupushow
). Místní proměnnánum
stínuje proměnnounum
na úrovni modulu v rámcishow
, takže místní proměnná je nastavená na hodnotu 2. V postupu však neexistuje žádná místní proměnná pro stínnum
useModuleLevelNum
.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 kvalifikujenum
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
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.
Definujte třídu odvozenou z třídy proměnné, pokud ještě neexistuje.
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ě. ProcedurashowStrings
v odvozené třídě zobrazí stínovací verzi řetězce, pokud názevshadowString
není kvalifikovaný. Potom zobrazí stínovou verzi, pokudshadowString
je kvalifikována pomocí klíčovéhoMyBase
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.