Практическое руководство. Сокрытие переменной с тем же именем, что и ваша переменная (Visual Basic)

Можно скрыть переменную , затенив ее, то есть переопредеив ее с переменной того же имени. Вы можете скрыть переменную двумя способами:

  • Тени через область. Вы можете затенить его через область, переобъявив его внутри региона, содержащего переменную, которую вы хотите скрыть.

  • Тени через наследование. Если переменная, которую требуется скрыть, определена на уровне класса, ее можно тени через наследование, переобъявив его с помощью теневого ключевое слово в производном классе.

Два способа скрыть переменную

Скрытие переменной путем тени его через область

  1. Определите регион, определяющий переменную, которую вы хотите скрыть, и определите область, в которой необходимо переопределить ее с помощью переменной.

    Регион переменной Допустимое значение для переопределения
    Модуль Класс в модуле
    Класс Подкласс в классе

    Процедура в классе

    Невозможно переопределить переменную процедуры в блоке в рамках этой процедуры, например в Ifконструкции или цикле For ...End If .

  2. Создайте этот регион, если он еще не существует.

  3. В пределах квадрата напишите оператор 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. Однако в процедуре нет локальной переменной numuseModuleLevelNum . useModuleLevelNum Поэтому задает значение переменной уровня модуля значение 1.

    Вызов MsgBox внутри show проходит механизм тени путем определения num имени модуля. Поэтому она отображает переменную уровня модуля вместо локальной переменной.

Скрытие переменной путем тени его через наследование

  1. Убедитесь, что переменная, которую вы хотите скрыть, объявлена в классе и на уровне класса (вне любой процедуры). В противном случае вы не можете затенить его через наследование.

  2. Определите класс, производный от класса переменной, если он еще не существует.

  3. В производном 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 помощью ключевое слово.

Отказоустойчивость

Тень представляет несколько версий переменной с одинаковым именем. Если оператор кода ссылается на имя переменной, версия, к которой компилятор разрешает ссылку, зависит от таких факторов, как расположение инструкции кода и наличие соответствующей строки. Это может увеличить риск обращения к непреднамеренной версии теневой переменной. Вы можете снизить этот риск, полностью квалифицируя все ссылки на теневую переменную.

См. также