型の上位変換 (Visual Basic)

モジュールでプログラミング要素を宣言すると、Visual Basic によって、そのスコープがモジュールを含む名前空間に昇格されます。 これは型の上位変換と呼ばれます。

次の例では、モジュールのスケルトン定義とそのモジュールの 2 つのメンバーを示しています。

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

projModule 内で、モジュール レベルで宣言されたプログラミング要素が projNamespace に昇格されます。 前の例では、basicEnuminnerClass は昇格されますが、numberSub は、モジュール レベルで宣言されていないため、昇格されません。

型の上位変換の効果

型の上位変換の効果は、修飾文字列にモジュール名を含める必要がないことです。 次の例では、前の例のプロシージャを 2 回呼び出しています。

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

前の例では、最初の呼び出しで完全修飾文字列を使用しています。 ただし、型の上位変換のため、これは必要ありません。 2 番目の呼び出しでは、修飾文字列に projModule を含めずに、モジュールのメンバーにアクセスしています。

型の上位変換の無効化

名前空間にモジュール メンバーと同じ名前のメンバーが既に存在する場合、そのモジュール メンバーに対して型の上位変換は無効になります。 次の例では、同じ名前空間内の列挙とモジュールのスケルトン定義を示しています。

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

前の例では、名前空間レベルで同じ名前を持つ列挙が既に存在するため、Visual Basic がクラス abcthisNameSpace に昇格できません。 abcSub にアクセスするには、完全修飾文字列 thisNamespace.thisModule.abc.abcSub を使用する必要があります。 ただし、クラス xyz は引き続き昇格され、短い修飾文字列 thisNamespace.xyz.xyzSub で、xyzSub にアクセスできます。

部分型の型の上位変換の無効化

モジュール内のクラスまたは構造体で Partial キーワードを使用している場合は、名前空間に同じ名前のメンバーが含まれているかどうかに関係なく、そのクラスまたは構造体に対する型の上位変換が自動的に無効になります。 モジュール内の他の要素は、引き続き型の上位変換の対象になります。

結果。 部分定義の型の上位変換の無効化によって、予期しない結果が発生したり、コンパイラ エラーが発生したりすることもあります。 次の例では、クラスのスケルトンの部分定義を示しており、そのうちの 1 つがモジュール内にあります。

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

前の例で、開発者は、コンパイラに sampleClass の 2 つの部分定義をマージすることを期待するかもしれません。 しかし、コンパイラでは sampleModule 内の部分定義の上位変換が考慮されません。 そのため、どちらも sampleClass という名前が付けられていますが、修飾パスが異なる 2 つの個別のクラスのコンパイルが試みられます。

コンパイラは、完全修飾されたパスがまったく同じ場合にのみ、部分定義をマージします。

推奨事項

次の推奨事項は、優れたプログラミング方法を示しています。

  • 一意の名前。 プログラミング要素の名前付けを完全に制御できる場合は、どこでも一意の名前を使用することをお勧めします。 同一の名前は追加の修飾が必要であり、コードが読みにくくなる可能性があります。 それらは、軽度のエラーや予期しない結果につながる可能性もあります。

  • 完全修飾。 同じ名前空間内のモジュールやその他の要素を操作する場合、最も安全な方法は、すべてのプログラミング要素に対して常に完全修飾を使用することです。 モジュール メンバーの型の上位変換が無効になっていて、そのメンバーを完全に修飾していない場合、誤って別のプログラミング要素にアクセスする可能性があります。

関連項目