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


Повышение типа

Обновлен: Ноябрь 2007

Когда в модуле объявляется элемент программирования, Visual Basic повышает уровень его области до пространства имен, содержащего модуль. Это называется повышение типа.

В приведенном ниже примере показано определение схемы модуля и двух членов этого модуля.

Namespace projNamespace
    Module projModule
        Public Enum basicEnum As Integer
            one = 1
            two = 2
        End Enum
        Public Class innerClass
            Public Sub numberSub(ByVal firstArg As Integer)
            End Sub
        End Class
    End Module
End Namespace

В пределах projModule элементы программирования, объявленные на уровне модуля, продвигаются до уровня projNamespace. В предыдущем примере basicEnum и innerClass продвигаются, а numberSub — нет, поскольку он не объявлен на уровне модуля.

Эффект повышения типа

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

Sub usePromotion()
    projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
    projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub

В предыдущем примере для первого вызова используются полные квалификационные строки. Однако это не обязательно, поскольку применяется повышение типа. Во втором вызове также присутствует обращение к членам модуля, но без включения projModule в строки квалификации.

Отмена повышения типа

Если в пространстве имен уже имеется член, имя которого совпадает с именем члена модуля, повышение типа для члена модуля отменяется. В приведенном ниже примере показано определение схемы перечисления и модуль в рамках одного пространства имен.

Namespace thisNamespace
    Public Enum abc
        first = 1
        second
    End Enum
    Module thisModule
        Public Class abc
            Public Sub abcSub()
            End Sub
        End Class
        Public Class xyz
            Public Sub xyzSub()
            End Sub
        End Class
    End Module
End Namespace

В предыдущем примере Visual Basic не удается повысить уровень класса abc до уровня thisNameSpace, поскольку уже существует перечисление с тем же именем на уровне пространства имен. Чтобы получить доступ к abcSub, необходимо использовать полную квалификационную строку thisNamespace.thisModule.abc.abcSub. Однако для класса xyz повышение уровня выполняется, и можно получить доступ к xyzSub с использованием укороченной квалификационной строки thisNamespace.xyz.xyzSub.

Отмена повышения типа для разделяемых типов

Если для класса или структуры внутри модуля используется ключевое слово Partial (Visual Basic), повышение типа для этого класса или структуры автоматически отменяется независимо от того, имеется ли в пространстве имен член с тем же именем. Для других элементов в модуле повышение типа по-прежнему возможно.

Последствия. Отмена повышения типа для частично выполненного определения может привести к непредсказуемым результатам и даже ошибкам компилятора. В приведенном ниже примере показана схема частично выполненных определений класса, одно из которых находится внутри модуля.

Namespace sampleNamespace
    Public Partial Class sampleClass
        Public Sub sub1()
        End Sub
    End Class
    Module sampleModule
        Public Partial Class sampleClass
            Public Sub sub2()
            End Sub
        End Class
    End Module
End Namespace

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

Компилятор выполняет слияние частично выполненных определений только в том случае, если их полные пути одинаковы.

Рекомендации

Приведенные далее рекомендации даны на основании практического опыта программирования.

  • Уникальные имена. Если имеется полный контроль над именованием элементов программирования, рекомендуется везде и всегда использовать уникальные имена. Одинаковые имена требуют дополнительного уточнения и могут сделать код трудным для чтения. Они также могут привести к непредсказуемым результатам и незаметным на первый взгляд ошибкам.

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

См. также

Задачи

Практическое руководство. Управление областью действия переменной

Основные понятия

Область видимости в Visual Basic

Разрешение ссылки, когда несколько переменных имеют одинаковые имена

Ссылки

Оператор Module

Оператор "Namespace"

Partial (Visual Basic)