VB.NETでも名前空間に別名を付けたい

別名

VB.NETは(無論C#もですよ)名前空間に別名を付けられます。

Imports コンソール = System.Console
Imports AAB = ImportAlias.Hoge.AAA
Imports BBA = ImportAlias.Hoge.Fuga.BBB


Module Module1

    Sub Main()
        Dim bba = New BBA()
        bba.SubBBB()
        Dim aab = New AAB()
        aab.SubAAA()
    End Sub

End Module

Namespace Hoge
    Class AAA
        Public Sub SubAAA()
            コンソール.WriteLine("AAA")
        End Sub
    End Class
    Namespace Fuga
        Class BBB
            Public Sub SubBBB()
                コンソール.WriteLine("BBB")
            End Sub
        End Class
    End Namespace
End Namespace

Imports ステートメント (.NET 名前空間および型)

文法は

Imports [別名 =] インポートする名前空間

です。 やたらAsを多用するVBらしくAsとか使えばよかったのにと思いますが残念ながら=です。 もちろん、別名を付けずにそのままフツーにImportsしてもokです。 また、この例のように別名に日本語って言うか要素名に日本語を使うと現場によってはPMがジャベリンを飛ばしてきたりチャーリーを奪還するために同僚がエボリューションを起こしてビルを倒壊させてきたり進捗の悪さに切れた顧客がC4バギー特攻を仕掛けてきたりするので注意が必要です。

まとめ

インポートした物に別名をつけるとタイプ量が減らせて便利ですね。 あとはクラス名が同じときにも別名をつければ名前空間で修飾しなくてもいいので便利です。

ここまで書いておいてアレですが、VB.NET名前空間ってプロジェクトの参照のところの設定で十把一からげにインポートされて終了しているのが多い気がします。*1

個人的にはプロジェクト設定で一括でインポートしてしまうのはコンパイラにとって*2曖昧でない場合はモジュール名を省略できるという正直全くありがたくない機能と合わせて二大VB.NETにおいて名前空間の意味を薄める機能だと思ってます。

といいますのも、ついこの前うっかりMicrosoft.VisualBasic名前空間で公開されているモジュールに含まれるメソッド名と被る名前のメソッドを他のモジュールで宣言してしまって一括インポートとの合わせ技によりメソッド名がコンパイラ的に一意でなくなり危うく既存のコードの修正が必要になる事態に陥りかけたのです。

別に使うなという訳ではないですが、挙動をある程度理解しないとドツボにハマる素敵仕様はなんとかならんものかとおもいましたまる

*1:この機能のおかげで名前空間を認識していないVB.NETプログラマもちらほら

*2:コンパイラにとってというところがまた厄介