今、VBの勉強をしているところです。(使用しているのは2008です。)
ByVal, ByRefについて質問があります。
例えば、数値(Integer等)や文字(String等)は、呼び出したサブルーチン内でByVal, ByRefの指定をすると、
・ByVal・・・呼び出したサブルーチン内で値が変更されても、呼び出し元の引数の値は変更されない。
・ByRef・・・呼び出したサブルーチン内で値が変更されると、呼び出し元の引数の値も変更される。
というふうに理解しています。(間違っていたら指摘ください。)
しかし、引数がオブジェクト(例えばテキストボックスのようなコントロール)の場合、
ByVal, ByRefとではどのように振る舞いが異なるのでしょうか?
例えば引数のコントロールの各プロパティの変更・各メソッドの実行による引数のコントロールの状態の変更を
サブルーチンで行いたい場合、ByValを使用した場合でも呼び出し元のコントロールの状態が
変更されているように思えるのですが、このようなケースでは、サブルーチンの引数を
ByValで宣言すればいいのか、ByRefで宣言すればいいのか、よく理解できません。
どなたか御説明頂けないでしょうか?
宜しくお願い申し上げます。
>(間違っていたら指摘ください。)
合っていますよ。
> しかし、引数がオブジェクト(例えばテキストボックスのようなコントロール)の場合、
> ByVal, ByRefとではどのように振る舞いが異なるのでしょうか?
変更という点について言えば、コントロールでも一緒です。たとえば、
Dim T As TextBox = Me.TextBox1
のような変数 T があったとして、それを ByRef な
Sub Foo( ByRef X As TextBox )
X = Me.TextBox2
End Sub
に渡したとしたら、処理の実行後、呼び出し元の変数 T が指し示すものは、
TextBox1 から TextBox2 へと変化します。
これが ByVal であったなら、変数 T は TextBox1 のままです。
> 例えば引数のコントロールの各プロパティの変更・各メソッドの実行
変数そのものの差し替えでは無く、渡されたオブジェクトのメンバを
操作するという事ですね。その場合の動作は、その引数のデータ型が
参照型(クラス)なのか、値型(構造体)なのかによって異なります。
値型の場合、そのメンバを操作しても、呼び出し元の変数には
影響を与えません。参照型の場合は、呼び出し元にも影響を与えます。
別の掲示板ですが、値型と参照型の動作の違いを、下記スレッド 12 番で
解説しています。概念的な説明の仕方なので、実際の動作を試してからで
ないと、意味が伝わりにくいかもしれませんけれども。
http://rucio.bbs.coocan.jp/?m=listthread&t_id=120
魔界の仮面弁士様、明快なご説明ありがとうございました。
よく分かりました。
今後とも宜しくお願い申し上げます。
ツイート | ![]() |