Поделиться через


Практическое руководство: Как скрыть переменную, имеющую такое же имя, как у вашей переменной (Visual Basic)

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

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

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

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

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

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

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

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

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

  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 затмевает переменную num уровня модуля внутри show, поэтому для локальной переменной задано значение 2. Однако в процедуре num отсутствует локальная переменная, чтобы затенять useModuleLevelNum. useModuleLevelNum Поэтому задает значение переменной уровня модуля значение 1.

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

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

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

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

  3. В производном классе напишите инструкцию Dim, объявляющую вашу переменную. Включите ключевое слово Shadows в объявление.

    Если код в производном классе ссылается на имя переменной, компилятор разрешает ссылку на вашу переменную.

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

    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.

Надежное программирование

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

См. также