メモ: VBScript と Visual Basic .NET 以降のものの変数の扱い(システム管理な雑記 -- Sleeve notes of a sysadmin --)より:
関数やサブプロシージャを作るときにちょっとポイントになると思うため、メモ。
既定では、渡し方(ByVal/ByRef) を指定していない変数は、 VBScript では ByRef つまり、モトの変数をそのまま「参照」して使う。Visual Basic .NET 以降の Visual Basic では、 ByVal で扱う。モトの変数のローカルコピーをメモリ空間上で新しく作って使う。リファレンスにしている MSDN ライブラリによると参照渡しでも値渡しでも、パフォーマンスには大きな差は生じないという。動きの面でたいして違わない場合は気にしないでもよいということかな。(CPU とメモリは節約できれば、したほうがいいと思うけど。)
なるほど。なかなかおもしろいので、取り上げさせていただきます。
これは、変数そのものが扱っている内容が変更されていることによるものです。そのことが実感できる実験してみましょう。
適当な VB.NET の Windows Form アプリケーションを用意します。フォームには TextBox を1つだけ置きます。そして、フォームのコンストラクタ(New サブプロシージャ)に、次のように書き加えます。
Public Sub New()
MyBase.New()
' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後に初期化を追加します。
' 次の行を追加する
AddHandler Application.Idle, AddressOf ByValAndByRef
End Sub
では、実験用のコードを追加します。
Public Class HogeClass
Public Value As Integer
End Class
Private Sub ByValAndByRef(ByVal sender As Object, ByVal e As EventArgs)
RemoveHandler Application.Idle, AddressOf ByValAndByRef
Dim hoge As New HogeClass
hoge.Value = 1
TextBox1.Text = hoge.Value.ToString() ' [A]
ByValFunc(hoge)
TextBox1.Text += hoge.Value.ToString() ' [B]
ByRefFunc(hoge)
TextBox1.Text += hoge.Value.ToString() ' [C]
End Sub
Sub ByValFunc(ByVal hage As HogeClass)
hage.Value = 2
hage = New HogeClass
hage.Value = 3
End Sub
Sub ByRefFunc(ByRef hage As HogeClass)
hage.Value = 4
hage = New HogeClass
hage.Value = 5
End Sub
ByValFunc および ByRefFunc では、同じことをしています。引数に値を入れて、新しいオブジェクトを作り、それに別の値を入れています。[A], [B], [C] で表示される値によって、何を参照しているかわかります。
実行する前に、どうなるか予想してみてください。表示されるものの候補は、
124
125
134
135
の4通りあります。さて、どうなるでしょうか?
あ・・・、ここで切ったら、もう1エントリ作れる(笑)
投稿日時 : 2007年5月26日 0:32