Повышение типа (Visual Basic)
При объявлении элемента программирования в модуле Visual Basic расширяет его область в пространство имен, содержащее модуль. Это называется повышением типа.
В следующем примере показано определение скелета модуля и два члена этого модуля.
Namespace projNamespace
Module projModule
Public Enum basicEnum As Integer
one = 1
two = 2
End Enum
Public Class innerClass
Shared 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
квалификации.
Поражение от повышения типа для частичных типов
Если класс или структура в модуле использует частичное ключевое слово, повышение типа автоматически побеждается для этого класса или структуры, независимо от того, имеет ли пространство имен элемент с тем же именем. Другие элементы в модуле по-прежнему имеют право на повышение типа.
Последствия. Поражение от распространения типа частичного определения может привести к непредвиденным результатам и даже ошибкам компилятора. В следующем примере показаны скелетные частичные определения класса, один из которых находится внутри модуля.
Namespace sampleNamespace
Partial Public Class sampleClass
Public Sub sub1()
End Sub
End Class
Module sampleModule
Partial Public Class sampleClass
Public Sub sub2()
End Sub
End Class
End Module
End Namespace
В предыдущем примере разработчик может ожидать, что компилятор объединяет два частичных sampleClass
определения. Однако компилятор не рассматривает повышение частичного определения внутри sampleModule
. В результате она пытается скомпилировать два отдельных и отдельных класса, как именованные sampleClass
, так и с различными путями квалификации.
Компилятор объединяет частичные определения, только если их полные пути идентичны.
Рекомендации
Следующие рекомендации представляют собой хорошую практику программирования.
Уникальные имена. Если у вас есть полный контроль над именованием элементов программирования, всегда рекомендуется использовать уникальные имена везде. Идентичные имена требуют дополнительной квалификации и могут усложнять чтение кода. Они также могут привести к тонким ошибкам и непредвиденным результатам.
Полная квалификация. При работе с модулями и другими элементами в одном пространстве имен самый безопасный подход — всегда использовать полную квалификацию для всех элементов программирования. Если повышение типа побеждено для члена модуля, и вы не полностью квалифицируйте этот элемент, вы можете случайно получить доступ к другому элементу программирования.