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.

Consulte también