Programmingソフトウェアエンジニア(VB開発者)

Visual Basicにおける変数のスコープ(範囲)はどのように機能し、プログラムの異なる部分で変数のアクセスに関する問題を回避するにはどうすればよいですか?

Hintsage AIアシスタントで面接を突破

回答

Visual Basicでは、変数のスコープは宣言された場所によって決まります:手続き内(ローカル変数)、クラス/モジュールレベル(クラスまたはモジュールの変数)、またはグローバルとして(別のファイル内)。

  • Dimが手続き内にある場合 — その手続き内でのみ変数はアクセス可能。
  • クラスまたはモジュールレベルのDim — クラス/モジュール内のすべての手続きでアクセス可能。
  • PublicPrivateFriendを使用することで、他のクラス/モジュールからのアクセスに制限を設けることができます。

例:

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変数を宣言し、各呼び出し時に「クリア」されると思っていました。その結果、再呼び出し時に合計が増加し、正しくない結果を出力しました。