Freigeben über


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

Referenz

Module-Anweisung

Namespace-Anweisung

Partial (Visual Basic)