Visual Basicのモジュール(Module)を使用すると、プロジェクト全体で利用可能な変数や手続きを宣言できます(適切なアクセス修飾子が必要です)。モジュール内で手続きの外に宣言された変数は、そのフィールドとなり、スコープは修飾子(Private/Friend/Public)によって異なり、ライフタイムはアプリケーションの実行時間中になります。
モジュール変数の主な特徴は以下の通りです:
グローバル変数(他の言語や古いVB6など)とは異なり、モジュール変数はPublicとして明示的に宣言しない限り、アセンブリの外部からはアクセスできません。
例:
Module Globals Public Counter As Integer Sub Increment() Counter += 1 End Sub End Module ' 同じプロジェクトの任意の場所からCounterにアクセス
質問: モジュール変数をPrivate修飾子で宣言した場合、どのようなアクセスがありますか?同じプロジェクト内の他のモジュールからアクセス可能ですか?
回答: いいえ、Private修飾子を持つ変数はこのモジュール内からのみアクセス可能で、他のモジュールやクラスからはアクセスできません。
Module Data Private x As Integer End Module ' Module Otherはxを見えません
逸話
計算サービスの開発中、すべての中間結果はモジュール変数に保存されました。ある開発者はデータが呼び出し間で「リセットされる」と考えていましたが、状態は保持されました(アプリケーションスコープ)。これは、サービスを同時に利用する複数のユーザーのエラーを引き起こしました。解決策:ローカル変数を使用し、モジュール内での状態保持を避ける必要がありました。
逸話
マルチファイルプロジェクトで、モジュール変数は
Friend修飾子で宣言されていました(Publicの代わりに)。これは関連するプロジェクト全体でアクセスできることを期待されましたが、実際には1つのアセンブリ内でのみ視認でき、統合時に予期しないアクセスエラーを引き起こしました。
逸話
コードの最適化後、プロセスの論理フラグが機能しなくなりました。クラスコンストラクタに静的ログフラグが定義されたモジュールが渡されていなかったためです。その結果、古いバージョンの値が使用され、システムは古いデータで動作していました。モジュール変数の状態変更点を追跡するのが難しいため、バグが長時間調査されました。