Promoción de tipos (Visual Basic)
Al declarar un elemento de programación en un módulo, Visual Basic promueve su ámbito al espacio de nombres que contiene el módulo. Esto se conoce como promoción de tipo.
En el ejemplo siguiente se muestra una definición esquemática de un módulo y dos miembros de ese módulo.
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
En projModule
, los elementos de programación declarados en el nivel de módulo se promueven a projNamespace
. En el ejemplo anterior, basicEnum
e innerClass
se promueven, pero numberSub
no, porque no se ha declarado en el nivel de módulo.
Efecto de la promoción de tipo
El efecto de la promoción de tipo es que una cadena de calificación no necesita incluir el nombre del módulo. En el ejemplo siguiente se realizan dos llamadas al procedimiento del ejemplo anterior.
Sub usePromotion()
projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub
En el ejemplo anterior, la primera llamada usa cadenas de calificación completas. Pero esto no es necesario con la promoción de tipo. La segunda llamada también accede a los miembros del módulo sin incluir projModule
en las cadenas de calificación.
Anulación de la promoción de tipo
Si el espacio de nombres ya tiene un miembro con el mismo nombre que un miembro del módulo, la promoción de tipo se anula para ese miembro del módulo. En el ejemplo siguiente se muestra una definición esquemática de una enumeración y un módulo dentro del mismo espacio de nombres.
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
En el ejemplo anterior, Visual Basic no puede promover la clase abc
a thisNameSpace
porque ya hay una enumeración con el mismo nombre en el nivel de espacio de nombres. Para acceder a abcSub
, debe usar la cadena de calificación completa thisNamespace.thisModule.abc.abcSub
. Pero la clase xyz
se sigue promoviendo, y se puede acceder a xyzSub
con la cadena e calificación más corta thisNamespace.xyz.xyzSub
.
Anulación de la promoción de tipo en tipos parciales
Si una clase o estructura dentro de un módulo usa la palabra clave Partial, la promoción de tipo se anula automáticamente para esa clase o estructura, independientemente de que el espacio de nombres tenga o no un miembro con el mismo nombre. Otros elementos del módulo siguen siendo aptos para la promoción de tipo.
Consequences. La anulación de la promoción de tipo de una definición parcial puede provocar resultados inesperados e incluso errores de compilador. En el ejemplo siguiente se muestran definiciones parciales esquemáticas de una clase, una de las cuales está dentro de un módulo.
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
En el ejemplo anterior, el desarrollador puede esperar que el compilador combine las dos definiciones parciales de sampleClass
. Pero el compilador no considera la promoción de la definición parcial dentro de sampleModule
. Como resultado, intenta compilar dos clases independientes y distintas, ambas de nombre sampleClass
, pero con diferentes rutas de calificación.
El compilador solo combina las definiciones parciales cuando sus rutas de acceso completas son idénticas.
Recomendaciones
Las siguientes recomendaciones representan un buen procedimiento de programación.
Nombres únicos. Si tiene control total sobre la nomenclatura de los elementos de programación, siempre es buena idea usar nombres únicos en todas partes. Los nombres idénticos requieren una calificación adicional y pueden hacer que el código sea más difícil de leer. También pueden provocar errores sutiles y resultados inesperados.
Calificación completa. Si trabaja con módulos y otros elementos en el mismo espacio de nombres, el enfoque más seguro es usar siempre calificación completa en todos los elementos de programación. Si la promoción de tipo se anula en un miembro del módulo y no califica por completo a ese miembro, podría acceder accidentalmente a otro elemento de programación.