Compartir a través de


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 de esqueleto 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

Dentro de projModule, los elementos de programación declarados en el nivel de módulo se promueven a projNamespace. En el ejemplo anterior, basicEnum y innerClass se promueven, pero numberSub no es así, porque no se declara 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 de esqueleto 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 tipos 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.

Consecuencias. 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 de esqueleto 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 podría 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 con nombre sampleClass pero con diferentes rutas de calificación.

El compilador combina definiciones parciales solo cuando sus rutas completas calificadas son idénticas.

Recomendaciones

Las siguientes recomendaciones representan una buena práctica de programación.

  • Nombres únicos. Cuando tiene control total sobre la nomenclatura de elementos de programación, siempre es una 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. Cuando trabajas con módulos y otros elementos dentro de un mismo espacio de nombres, el enfoque más seguro es utilizar siempre la calificación completa para 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