変数宣言修飾語で、モジュール全体にわたって有効にすることを指定します。
構文:
記述:
Shared は、モジュール-レベルの変数を、
Sub と
Function の中で見えるように(値を共有)します。
Shared を、モジュール・レベル変数を宣言するときに使わないと、変数は、そのファイルのモジュール-レベルコードに見えるだけです。
(さらに、
Shared 修飾子なしで
Dim で宣言した変数で、Namespace ブロック内でない変数だけは、スタックに保存されます。)
注意 (
Common(共通) 変数を除く共有変数のために):
-
一般に、Shared(共有) 変数は、定数値で初期化されるだけです。
(その初期値は、何かコードが実行される前に、.data 部でプログラムの最初に設定されます。このため、コード中のどんな変数や関数にも影響されません。)
-
一つ目の例外は、可変長文字列型の Shared 変数です。
可変長文字列型は、文字定数を用いても、決して初期化できません。
(なぜなら、その構造が、動的メモリブロックを指す .data セクション内の記述子を使うからです。)
-
二つ目の例外は、黙示の構築子を持つユーザー定義型の Shared 変数です。
これは非定数値で初期化することができます。
(それは、構築子コードで、.data セクションに「初期」値を書き込むプログラムの起動時に呼び出されるからです。)
ローカル・スコープ・ブロックからグローバル名前空間で定義された共有変数の複製されたシンボルにアクセスするには、プレフィックスとして1つまたはできれば2つのドットを追加します:
.SomeSymbol またはできれば
..SomeSymbol (
With..End With ブロック内の場合は
..SomeSymbolのみ)。
例:
'' -lang qb か fbliteで、コンパイルします
'$lang: "qb"
Declare Sub MySub
Dim Shared x As Integer
Dim y As Integer
x = 10
y = 5
MySub
Sub MySub
Print "x is "; x '共有されているので、これは 10 と表示されます
Print "y is "; y '共有されていないので、これは 5 と表示されません
End Sub
Sleep
QBからの違い:
-
範囲ブロック (function, sub, if/then, loop) の中の、Shared 命令文は、サポートされません。
代わりに、主プログラムで、Dim|Redim|Common|Static Shared を使います。
もしくは、範囲ブロックの内部にいて、前もって Shared で準備した変数または配列を、Redim しているなら、Shared なしで Redim してください。
Redim は、うまく働いて、何も破滅させないでしょう。
参照: