Практическое руководство. Сокрытие переменной с тем же именем, что и ваша переменная (Visual Basic)
Можно скрыть переменную , затенив ее, то есть переопредеив ее с переменной того же имени. Вы можете скрыть переменную двумя способами:
Тени через область. Вы можете затенить его через область, переобъявив его внутри региона, содержащего переменную, которую вы хотите скрыть.
Тени через наследование. Если переменная, которую требуется скрыть, определена на уровне класса, ее можно тени через наследование, переобъявив его с помощью теневого ключевое слово в производном классе.
Два способа скрыть переменную
Скрытие переменной путем тени его через область
Определите регион, определяющий переменную, которую вы хотите скрыть, и определите область, в которой необходимо переопределить ее с помощью переменной.
Регион переменной Допустимое значение для переопределения Модуль Класс в модуле Класс Подкласс в классе
Процедура в классеНевозможно переопределить переменную процедуры в блоке в рамках этой процедуры, например в
If
конструкции или циклеFor
...End If
.Создайте этот регион, если он еще не существует.
В пределах квадрата напишите оператор Dim, объявляющий теневой переменной.
Если код внутри многомерного выражения ссылается на имя переменной, компилятор разрешает ссылку на переменную тени.
В следующем примере показано тени через область, а также ссылка, которая проходит тень.
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
В предыдущем примере переменная
num
объявляется как на уровне модуля, так и на уровне процедуры (в процедуреshow
). Локальная переменная тени переменнойnum
уровня модуля внутриshow
, поэтому для локальной переменнойnum
задано значение 2. Однако в процедуре нет локальной переменнойnum
useModuleLevelNum
.useModuleLevelNum
Поэтому задает значение переменной уровня модуля значение 1.Вызов
MsgBox
внутриshow
проходит механизм тени путем определенияnum
имени модуля. Поэтому она отображает переменную уровня модуля вместо локальной переменной.
Скрытие переменной путем тени его через наследование
Убедитесь, что переменная, которую вы хотите скрыть, объявлена в классе и на уровне класса (вне любой процедуры). В противном случае вы не можете затенить его через наследование.
Определите класс, производный от класса переменной, если он еще не существует.
В производном
Dim
классе напишите оператор, объявляющий переменную. Включите ключевое слово тени в объявлении.Если код в производном классе ссылается на имя переменной, компилятор разрешает ссылку на переменную.
В следующем примере показано тени через наследование. Он делает две ссылки, один из них обращается к теневой переменной и той, которая проходит затенение.
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
В предыдущем примере переменная объявляется
shadowString
в базовом классе и тенирует ее в производном классе.showStrings
Процедура в производном классе отображает версию теневой строки, если имяshadowString
не указано. Затем отображается теневая версия, когдаshadowString
она квалифицирована сMyBase
помощью ключевое слово.
Отказоустойчивость
Тень представляет несколько версий переменной с одинаковым именем. Если оператор кода ссылается на имя переменной, версия, к которой компилятор разрешает ссылку, зависит от таких факторов, как расположение инструкции кода и наличие соответствующей строки. Это может увеличить риск обращения к непреднамеренной версии теневой переменной. Вы можете снизить этот риск, полностью квалифицируя все ссылки на теневую переменную.