佐々木屋

技術的なことから趣味まで色々書きます

ここがダメだよ!VB.NET⑤(静的クラスが無いのよ)

そうなんです。VB.NETには静的クラスが無いんです。

「モジュールがあるやん?」

と思った方。
VB.NETのモジュールがC#の静的クラスとよく混同されますが、残念ながら100%同じというわけではないのです。

呼び出し方

静的クラスの場合、メンバーの呼び出しは同一名前空間にあってもクラス名が必要です。

public static class TestStaticClass {
    public static void StaticMethod() {
        Console.WriteLine("hoge");
    }
}

public static void Main() {
    TestStaticClass.StaticMethod();
}

この為、名前衝突が起こりにくいですし、明示的にどこから呼ばれているのかも分かります。


モジュールの場合、メンバーの呼び出しはクラス名をそのまま呼び出せてしまいます。

Public Module TestModule
    Public Sub StaticMethod()
        Console.WriteLine("hoge")
    End Sub
End Module

Public Sub Main()
    StaticMethod()
End Sub

これは結構致命的で、どこのクラスから呼び出されたものなのかも不明です。また名前衝突も発生しやすくなります。

初期化タイミング

少し分かりにくい&影響が見えない部分ですが、静的クラスとモジュールではbeforefieldinit フラグの設定有無により初期化タイミングが異なります。

静的クラスの場合、通常beforefieldinitフラグが設定されますので、静的クラスへアクセスする前に初期化されることが保証されています。その為、プログラム実行中は静的クラスが初期化されたかどうかのチェックは内部的に実行されることはありません。

モジュールの場合、beforefieldinitフラグは設定されていませんので、モジュールへアクセスする時に初めて初期化されます。よって、プログラム実行中にモジュールが初期化されたかどうかのチェックが行われます。この処理は場合によってはアプリケーション自体のパフォーマンスに影響を及ぼします。