Share via


Tür Yükseltme (Visual Basic)

Bir modülde bir programlama öğesi bildirdiğinizde, Visual Basic bu öğenin kapsamını modülü içeren ad alanına yükselter. Bu tür yükseltme olarak bilinir.

Aşağıdaki örnekte bir modülün iskelet tanımı ve bu modülün iki üyesi gösterilmektedir.

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

içinde projModule, modül düzeyinde bildirilen programlama öğeleri olarak projNamespaceyükseltilir. Yukarıdaki örnekte ve basicEnuminnerClass yükseltilir, ancak numberSub değil çünkü modül düzeyinde bildirilmemiştir.

Tür Yükseltmenin Etkisi

Tür yükseltmenin etkisi, bir niteleme dizesinin modül adını içermesi gerekmemesidir. Aşağıdaki örnek, önceki örnekte yordama iki çağrı yapar.

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

Yukarıdaki örnekte, ilk çağrı tam niteleme dizelerini kullanır. Ancak, tür yükseltme nedeniyle bu gerekli değildir. İkinci çağrı, niteleme dizelerini eklemeden projModule modülün üyelerine de erişir.

Tür Yükseltmenin Yenilgisi

Ad alanında zaten modül üyesiyle aynı ada sahip bir üye varsa, bu modül üyesi için tür yükseltmesi yenilir. Aşağıdaki örnekte bir sabit listesi ve aynı ad alanı içindeki bir modülün iskelet tanımı gösterilmektedir.

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

Yukarıdaki örnekte, ad alanı düzeyinde aynı ada sahip bir numaralandırma zaten olduğundan Visual Basic sınıfını abcthisNameSpace yükseltemiyor. öğesine erişmek abcSubiçin tam niteleme dizesini thisNamespace.thisModule.abc.abcSubkullanmanız gerekir. Ancak, sınıf xyz yine yükseltilir ve daha kısa niteleme dizesi thisNamespace.xyz.xyzSubile erişebilirsinizxyzSub.

Kısmi Türler için Tür Yükseltmesinin Yenilgisi

Bir modülün içindeki bir sınıf veya yapı Partial anahtar sözcüğünü kullanıyorsa, ad alanının aynı ada sahip bir üyesi olsun veya olmasın, bu sınıf veya yapı için tür yükseltmesi otomatik olarak yenilir. Modüldeki diğer öğeler hala tür yükseltme için uygundur.

Sonuç -ları. Kısmi tanımın tür yükseltmesinin yenilgisi beklenmeyen sonuçlara ve hatta derleyici hatalara neden olabilir. Aşağıdaki örnekte, bir sınıfın bir modül içinde yer alan iskelet kısmi tanımları gösterilmektedir.

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

Yukarıdaki örnekte, geliştirici derleyicinin iki kısmi tanımını birleştirmesini sampleClassbekleyebilir. Ancak, derleyici içinde sampleModulekısmi tanım için yükseltmeyi dikkate almaz. Sonuç olarak, her ikisi de farklı sampleClass niteleme yollarına sahip iki ayrı ve ayrı sınıf derlemeye çalışır.

Derleyici, kısmi tanımları yalnızca tam yolları aynı olduğunda birleştirir.

Öneriler

Aşağıdaki öneriler iyi programlama uygulamalarını temsil eder.

  • Benzersiz Adlar. Programlama öğelerinin adlandırması üzerinde tam denetime sahip olduğunuzda, her yerde benzersiz adlar kullanmak her zaman iyi bir fikirdir. Özdeş adlar ek nitelik gerektirir ve kodunuzun okunmasını zorlaştırabilir. Bunlar ayrıca ince hatalara ve beklenmeyen sonuçlara yol açabilir.

  • Tam Nitelik. Aynı ad alanındaki modüller ve diğer öğelerle çalışırken en güvenli yaklaşım, tüm programlama öğeleri için her zaman tam niteleme kullanmaktır. Tür yükseltmesi bir modül üyesi için yenilirse ve bu üyeyi tam olarak nitelemezseniz, istemeden farklı bir programlama öğesine erişebilirsiniz.

Ayrıca bkz.