Повышение типа
Обновлен: Ноябрь 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
Разрешение ссылки, когда несколько переменных имеют одинаковые имена