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 projModule
werden 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 abc
thisNameSpace
nicht höher stufen, da bereits eine Enumeration mit demselben Namen auf Namespaceebene vorhanden ist. Für den Zugriff abcSub
müssen Sie die vollständige Qualifizierungszeichenfolge thisNamespace.thisModule.abc.abcSub
verwenden. 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.