Typerweiterung
Aktualisiert: November 2007
Wenn Sie in einem Modul ein Programmierelement deklarieren, wird dessen Gültigkeitsbereich von Visual Basic auf den Namespace erweitert, der das Modul enthält. Dies wird als Typerweiterung bezeichnet.
Am folgenden Beispiel wird gezeigt, wie die Gerüstdefinition für ein Modul und zwei Member dieses Moduls erfolgt.
Namespace projNamespace
Module projModule
Public Enum basicEnum As Integer
one = 1
two = 2
End Enum
Public Class innerClass
Public Sub numberSub(ByVal firstArg As Integer)
End Sub
End Class
End Module
End Namespace
Innerhalb von projModule werden auf Modulebene deklarierte Programmierelemente auf projNamespace erweitert. Im vorhergehenden Beispiel werden basicEnum und innerClass erweitert, numberSub dagegen nicht, da es auf Modulebene nicht deklariert ist.
Folgen der Typerweiterung
Aufgrund der Typerweiterung müssen Qualifikationspfade nicht den Modulnamen enthalten. Im folgenden Beispiel wird die Prozedur aus dem obigen Beispiel zwei Mal aufgerufen.
Sub usePromotion()
projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub
Im vorhergehenden Beispiel werden im ersten Aufruf vollständige Qualifizierungspfade verwendet. Dank der Typerweiterung ist dies jedoch nicht notwendig. Im zweiten Aufruf erfolgt ebenfalls ein Zugriff auf die Member des Moduls, ohne dass projModule in die Qualifizierungspfade einbezogen wird.
Fehlschlagen der Typerweiterung
Wenn der Namespace bereits einen Member mit dem gleichen Namen als Modulmember enthält, ist eine Typerweiterung für den betreffenden Modulmember nicht möglich. Im folgenden Beispiel wird gezeigt, wie die Gerüstdefinition für eine Enumeration und ein Modul innerhalb desselben Namespaces durchgeführt wird.
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 vorhergehenden Beispiel kann Visual Basic die abc-Klasse nicht auf thisNameSpace erweitern, da dort bereits eine Enumeration mit dem gleichen Namen auf Namespaceebene vorhanden ist. Wenn Sie auf abcSub zugreifen möchten, müssen Sie den vollständigen Qualifizierungspfad thisNamespace.thisModule.abc.abcSub verwenden. Die xyz-Klasse wird jedoch erweitert, und Sie können über den kürzeren Qualifizierungspfad thisNamespace.xyz.xyzSub auf xyzSub zugreifen.
Fehlschlagen der Typerweiterung für partielle Typen
Wenn in einer Klasse oder in einer Struktur innerhalb eines Moduls das Partial (Visual Basic)-Schlüsselwort verwendet wird, ist die Typerweiterung für die betreffende Klasse oder Struktur automatisch nicht mehr möglich. Dies gilt unabhängig davon, ob es im Namespace einen Member mit dem gleichen Namen gibt. Andere Elemente im Modul sind dennoch weiterhin für die Typerweiterung geeignet.
Folgen. Das Fehlschlagen der Typerweiterung einer partiellen Definition kann unerwartete Ergebnisse und sogar Compilerfehler verursachen. Im folgenden Beispiel werden partielle Gerüstdefinitionen einer Klasse dargestellt; eine dieser Definitionen befindet sich innerhalb eines Moduls.
Namespace sampleNamespace
Public Partial Class sampleClass
Public Sub sub1()
End Sub
End Class
Module sampleModule
Public Partial Class sampleClass
Public Sub sub2()
End Sub
End Class
End Module
End Namespace
Im vorhergehenden Beispiel erwartet der Entwickler möglicherweise, dass der Compiler die beiden partiellen Definitionen von sampleClass zusammenführt. Der Compiler zieht jedoch keine Erweiterung der partiellen Definition in sampleModule in Betracht. Daher versucht er, zwei separate Klassen zu kompilieren. Diese heißen zwar beide sampleClass, zeichnen sich aber durch unterschiedliche Qualifizierungspfade aus.
Der Compiler führt partielle Definitionen nur zusammen, wenn ihre voll qualifizierten Pfade identisch sind.
Empfehlungen
Die folgenden Empfehlungen erleichtern Ihnen Ihre Programmierarbeit.
Eindeutige Namen. Wenn ausschließlich Sie die Benennung von Programmierelementen vornehmen, sollten Sie eindeutige Namen verwenden. Identische Namen erfordern zusätzliche Qualifizierung und können das Lesen des Codes erschweren. Darüber hinaus können sie zu schwierig zu entdeckenden Fehlern und unerwarteten Ergebnissen führen.
Volle Qualifizierung. Wenn Sie mit Modulen und anderen Elementen im gleichen Namespace arbeiten, ist es am sichersten, alle Programmierelemente stets voll zu qualifizieren. Wenn die Typerweiterung für einen Modulmember nicht möglich ist und Sie den betreffenden Member nicht voll qualifizieren, greifen Sie unter Umständen versehentlich auf ein anderes Programmierelement zu.
Siehe auch
Aufgaben
Gewusst wie: Steuern des Gültigkeitsbereichs einer Variablen
Konzepte
Gültigkeitsbereich in Visual Basic
Auflösen eines Verweises bei mehreren Variablen mit gleichem Namen