Megosztás a következőn keresztül:


Típus-előléptetés (Visual Basic)

Amikor egy modulban deklarál egy programozási elemet, a Visual Basic előlépteti annak hatókörét a modult tartalmazó névtérre. Ezt típus-előléptetésnek nevezzük.

Az alábbi példa egy modul és a modul két tagjának csontvázdefinícióját mutatja be.

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

A projModule-on belül a modulszinten deklarált programozási elemek előléptetődnek a projNamespace-be. Az előző példában basicEnum-t és innerClass-t előléptetik, de numberSub-t nem, mert nem modulszinten van deklarálva.

Típuselőléptetés hatása

A típus-előléptetés hatása, hogy a minősítési sztringnek nem kell tartalmaznia a modul nevét. Az alábbi példa két hívást kezdeményez az előző példában bemutatott eljáráshoz.

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

Az előző példában az első hívás teljes minősítési sztringeket használ. Ez azonban a típus-előléptetés miatt nem szükséges. A második hívás a modul tagjaihoz is hozzáfér anélkül, hogy projModule-t tartalmazna a minősítési sztringekben.

A típuspromóció veresége

Ha a névtérnek már van egy olyan tagja, amelynek a neve megegyezik a modultag nevével, akkor a rendszer nem engedélyezi a típus-előléptetést a modultag számára. Az alábbi példa egy enumerálás és egy modul csontvázdefinícióját mutatja be ugyanabban a névtérben.

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

Az előző példában a Visual Basic nem tudja előléptetni az osztályt abcthisNameSpace , mert már létezik egy azonos nevű enumerálás a névtér szintjén. A hozzáféréshez abcSuba teljes minősítési karakterláncot thisNamespace.thisModule.abc.abcSubkell használnia. Azonban az xyz osztály továbbra is elő van léptetve, és elérhető a rövidebb minősítési sztring xyzSub használatával thisNamespace.xyz.xyzSub.

A típus-előléptetés sikertelensége részleges típusok esetén

Ha egy modulban egy osztály vagy struktúra a Részleges kulcsszót használja, a rendszer automatikusan elutasítja a típus-előléptetést az adott osztály vagy struktúra esetében, függetlenül attól, hogy a névtérnek azonos nevű tagja van-e. A modul egyéb elemei továbbra is jogosultak a típus-előléptetésre.

Következmények. A részleges definíció típus-előléptetésének veresége váratlan eredményeket és még fordítóhibákat is okozhat. Az alábbi példa egy osztály részleges definícióit mutatja be, amelyek közül az egyik egy modulban található.

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

Az előző példában a fejlesztő elvárhatja, hogy a fordító egyesítse a két részleges definíciót sampleClass. A fordító azonban nem veszi figyelembe a részleges definíció előléptetését.sampleModule Ennek eredményeképpen két külön és különálló osztályt próbál összeállítani, mindkettő neve el van nevezve sampleClass , de különböző minősítési útvonalakkal.

A fordító csak akkor egyesíti a részleges definíciókat, ha azok teljes elérési útja azonos.

Ajánlások

Az alábbi javaslatok a helyes programozási gyakorlatot jelölik.

  • Egyedi nevek. Ha teljes mértékben szabályozhatja a programozási elemek elnevezését, mindig érdemes mindenhol egyedi neveket használni. Az azonos nevek további minősítést igényelnek, és megnehezíthetik a kód olvasását. Emellett apró hibákhoz és váratlan eredményekhez is vezethetnek.

  • Teljes képesítés. Amikor modulokkal és más elemekkel dolgozik ugyanabban a névtérben, a legbiztonságosabb módszer az, ha minden programozási elemhez teljes minősítést használ. Ha egy modultag esetében a típus-előléptetés meghiúsul, és ön nem jogosult teljes mértékben erre a tagra, véletlenül hozzáférhet egy másik programozási elemhez.

Lásd még