Freigeben über


Typerweiterung (Visual Basic)

Wenn Sie ein Programmierelement in einem Modul deklarieren, erweitert Visual Basic seinen Bereich auf den Namespace, der das Modul enthält. Dies wird als Typaktionbezeichnet.

Das folgende Beispiel zeigt eine Grundstruktur eines Moduls und zwei Mitglieder dieses Moduls.

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

Innerhalb projModule werden auf Modulebene deklarierte Programmierelemente auf projNamespace befördert. Im vorangehenden Beispiel werden basicEnum und innerClass höhergestuft, numberSub jedoch nicht, da es nicht auf Modulebene deklariert ist.

Auswirkung der Typ-Heraufstufung

Der Effekt der Typheraufwendung besteht darin, dass eine Qualifizierungszeichenfolge nicht den Modulnamen enthalten muss. Im folgenden Beispiel werden zwei Aufrufe der Prozedur aus dem vorherigen Beispiel ausgeführt.

Sub usePromotion()
    projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
    projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub

Im vorherigen Beispiel verwendet der erste Aufruf vollständige Qualifizierungszeichenfolgen. Dies ist jedoch aufgrund der Typförderung nicht erforderlich. Der zweite Aufruf greift auch auf die Member des Moduls zu, ohne in die Qualifizierungszeichenfolgen eingeschlossen projModule zu werden.

Niederlage der Typförderung

Wenn der Namespace bereits über ein Mitglied mit demselben Namen wie ein Modulmemb verfügt, wird die Typaufufung für dieses Modulelement besiegt. Das folgende Beispiel zeigt eine Skelettdefinition einer Enumeration und eines Moduls innerhalb desselben Namespaces.

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

Im vorherigen Beispiel kann Visual Basic die Klasse abcthisNameSpace nicht höher stufen, da bereits eine Enumeration mit demselben Namen auf Namespaceebene vorhanden ist. Für den Zugriff abcSubmüssen Sie die vollständige Qualifizierungszeichenfolge thisNamespace.thisModule.abc.abcSubverwenden. Die Klasse xyz wird jedoch weiterhin beworben, und Sie können mit der kürzeren qualifizierten Zeichenfolge xyzSub auf thisNamespace.xyz.xyzSub zugreifen.

Niederlage der Typförderung für Teiltypen

Wenn eine Klasse oder Struktur innerhalb eines Moduls das Partielle Schlüsselwort verwendet, wird die Typaufstufung für diese Klasse oder Struktur automatisch besiegt, unabhängig davon, ob der Namespace über ein Element mit demselben Namen verfügt. Andere Elemente im Modul sind weiterhin für die Typförderung berechtigt.

Konsequenzen. Die Niederlage der Typförderung einer partiellen Definition kann zu unerwarteten Ergebnissen und sogar Compilerfehlern führen. Das folgende Beispiel zeigt Teildefinitionen einer Klasse, die sich innerhalb eines Moduls befindet.

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

Im vorherigen Beispiel könnte der Entwickler möglicherweise erwarten, dass der Compiler die beiden Teildefinitionen von sampleClass zusammenführt. Der Compiler berücksichtigt jedoch keine Heraufstufung bei der partiellen Definition in sampleModule. Daher wird versucht, zwei getrennte und unterschiedliche Klassen zu kompilieren, die beide sampleClass benannt sind, aber mit unterschiedlichen Qualifizierungspfaden.

Der Compiler führt Teildefinitionen nur zusammen, wenn ihre vollqualifizierten Pfade identisch sind.

Empfehlungen

Die folgenden Empfehlungen stellen eine gute Programmierpraxis dar.

  • Eindeutige Namen. Wenn Sie die Vollständige Kontrolle über die Benennung von Programmierelementen haben, empfiehlt es sich immer, überall eindeutige Namen zu verwenden. Identische Namen erfordern eine zusätzliche Qualifikation und können das Lesen ihres Codes erschweren. Sie können auch zu subtilen Fehlern und unerwarteten Ergebnissen führen.

  • Vollständige Qualifikation. Wenn Sie mit Modulen und anderen Elementen im selben Namespace arbeiten, besteht der sicherste Ansatz darin, immer die volle Qualifikation für alle Programmierelemente zu verwenden. Wenn die Typförderung für ein Modulmitglied besiegt wird und Sie dieses Mitglied nicht vollständig qualifizieren, können Sie versehentlich auf ein anderes Programmierelement zugreifen.

Siehe auch