Visual Basicでは、変数のスコープは宣言された場所によって決まります:手続き内(ローカル変数)、クラス/モジュールレベル(クラスまたはモジュールの変数)、またはグローバルとして(別のファイル内)。
Dimが手続き内にある場合 — その手続き内でのみ変数はアクセス可能。Dim — クラス/モジュール内のすべての手続きでアクセス可能。Public、Private、Friendを使用することで、他のクラス/モジュールからのアクセスに制限を設けることができます。例:
Module Module1 Dim moduleVar As Integer = 5 Sub Main() Dim localVar As Integer = 10 Console.WriteLine(moduleVar) ' アクセス可能 Console.WriteLine(localVar) ' アクセス可能 End Sub Sub OtherSub() Console.WriteLine(moduleVar) ' アクセス可能 Console.WriteLine(localVar) ' エラー! End Sub End Module
手続き内で
Staticを使って宣言された変数のスコープは何ですか?
回答:
手続き内でStaticキーワードを使って宣言された変数は、その手続き内でのみアクセス可能ですが、手続きの呼び出し間で値が保持されます。
例:
Sub Counter() Static count As Integer count = count + 1 Console.WriteLine(count) End Sub ' Counterの各呼び出しでcountが増加します
ストーリー
プロジェクト内で、For ループ内でフラグ変数Dim x As Booleanが宣言され、各イテレーションで「リセット」されることが期待されました(他の言語のように)。しかし、ループを抜けた後も変数はアクセス可能で、プロシージャを2回目に実行したときに予測不可能な動作を引き起こしました。
ストーリー
プログラマの一人がモジュール内にpublic変数を宣言し、同じ名前の別のモジュールによって偶然に上書きされ、プログラムのさまざまな部分で重大なエラーを引き起こしました。これによりデバッグが困難になり、誰もその原因を理解できませんでした。
ストーリー
学生が一つの副プログラムで合計を蓄積するためにStatic変数を宣言し、各呼び出し時に「クリア」されると思っていました。その結果、再呼び出し時に合計が増加し、正しくない結果を出力しました。