Share via


Typerweiterung (Visual Basic)

Wenn Sie ein Programmierelement in einem Modul deklarieren, stuft Visual Basic seinen Bereich auf den Namespace mit dem Modul weiter. Dies wird als Typaktionbezeichnet.

Das folgende Beispiel zeigt eine Skelettdefinition eines Moduls und zwei Member 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 projModulewerden auf Modulebene deklarierte Programmierelemente auf projNamespace. Im vorangehenden Beispiel werden sie innerClass höhergestuft, basicEnum aber numberSub nicht, da sie nicht auf Modulebene deklariert wird.

Auswirkung der Typ-Heraufsufung

Der Effekt der Typheraufwendung besteht darin, dass eine Qualifizierungszeichenfolge nicht den Modulnamen enthalten muss. Im folgenden Beispiel werden zwei Aufrufe der Prozedur im 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 höhergestuft, und Sie können mit der kürzeren Qualifikationszeichenfolge thisNamespace.xyz.xyzSub zugreifen xyzSub.

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 erwartet der Entwickler möglicherweise, dass der Compiler die beiden Teildefinitionen von sampleClass. Der Compiler berücksichtigt jedoch keine Förderung für die partielle Definition in sampleModule. Daher wird versucht, zwei getrennte und unterschiedliche Klassen zu kompilieren, die beide benannt, aber mit unterschiedlichen Qualifikationspfaden. sampleClass

Der Compiler führt partielle Definitionen nur zusammen, wenn ihre voll qualifizierten 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