情報を、手続きに渡します。
パラメタを宣言
手続きが呼ばれるとき、手続きは、変数とオブジェクトの形で渡される情報を、受け取ることがができます。
手続き呼び出しの文脈で、これらの変数とオブジェクトは、引数と呼ばれます。
そして、これらの引数は、いわゆるパラメタとして、手続きの本体の中で、表されます。
パラメタは、いかなる他の変数やオブジェクトと、まったく同じように使用できます。
手続きを呼ぶときに、引数を渡すようにするために、パラメータ・リストを付けて、手続きを宣言してください。
パラメータ・リストは、1つ以上の、名前と型のリストです。手続きは、手続きに渡される引数を参照するとき、その名前と型を使います。
パラメータ・リストは、丸括弧で囲みます。
Sub Procedure
(s As String, n As Integer)
Print "パラメタには、値があります:
" & s & " と " & n
End Sub
Procedure "abc", 123
Sleep
下のように出力されるはずです:
引数を手続きに渡す、2つの方法があります:
値渡しと、参照渡しです。
別の方法で指定しない場合、デフォルトで、引数は値で渡されます。
引数の値受渡し
値によって渡される引数は、実際に手続きに渡されません。
引数のコピーが、代わりに作られていて、渡されます。
これは、手続きはコピーを変更できることを意味します。そして、元の変数やオブジェクトは、変わらずに残ります。
オブジェクトを、値で手続きに渡すとき、コピーは、
Type か
Class のコピー構築子を呼ぶことで、なされます。
引数を値で渡すように指定するには、手続きの宣言で、
Byval 予約語を、パラメタ名の前に付けてください:
Sub Procedure
(ByVal param As Integer)
param *= 2
Print "パラメータ 'param' = " & param
End Sub
Dim arg As Integer = 10
Print "呼び出し前の 'arg' の値 = " & arg
Procedure
(arg)
Print "呼び出し後の 'arg' の値 = " & arg
Sleep
下のように出力されるはずです:
呼び出し前の 'arg' の値 = 10
パラメータ 'param' = 20
呼び出し後の 'arg' の値 = 10
丸括弧が、手続き呼び出しで、どのように、引数(上の場合は、arg 1つだけ)を囲むか、に注意してくださいか。
これらの丸括弧は、任意ですが、手続き呼び出しを表す、一般的な規則です。
引数の参照受渡し
値によって渡される引数と異なって、手続きに参照で渡されるされる引数は、本当に渡されます。
コピーは、作られません。
これは、手続きは、手続きに渡された元の変数やオブジェクトを、変更できることを意味します。
参照は、変数やオブジェクトの、別名に似ています。
参照を呼ぶときはいつも、実際の変数やオブジェクトを、その別名で呼んでいるのです。
言い換えれば、手続きの参照パラメタを、手続きに渡される引数と考えることができます。
参照パラメタにされた変更は、すべて、実際にそれが表す引数の変化です。
引数を、参照で渡すように指定するには、手続きの宣言で、
Byref 予約語を、パラメタ名の前に付けてください:
Sub Procedure
(ByRef param As Integer)
param *= 2
Print "パラメータ 'param' = " & param
End Sub
Dim arg As Integer = 10
Print "呼び出し前の 'arg' の値 = " & arg
Procedure
(arg)
Print "呼び出し後の 'arg' の値 = " & arg
Sleep
下のように出力されるはずです:
呼び出し前の 'arg' の値 = 10
パラメータ 'param' = 20
呼び出し後の 'arg' の値 = 20
手動でポインターを副参照パラメータに渡す
Byval キーワードを、
Byref パラメータに対する引数の前で、指定することによって、アドレス(通常ポインターに保存される)は、現状のままで直接渡されることができます。そして、
Byref パラメータに、アドレスが指した同じ記憶域に、リファレンスをつけることを、強いることができます。
Sub f( ByRef i As Integer )
i = 456
End Sub
Dim i As Integer = 123
Dim pi As Integer Ptr = @i
Print i
f( ByVal pi )
Print i
Sleep
参照: