関数、メソッドの引数にByValやByRefと書いてある場合がありますが、
どういう意味か知っているでしょうか?
ByValとByRefの違い
Sub Main()
Dim a As Integer = 100
Dim b As Integer = 10
Dim ret As Integer = 0
ret = tasizan(a, b)
Console.WriteLine(ret)
End Sub
Function tasizan(data1 As Integer, data2 As Integer) As Integer
Return data1 + data2
End Function
110
このプログラムは、関数tasizanに足し算をしてもらい、
結果を表示する、ごく普通のプログラムです。
特に何の疑問も無いと思います。
続いて、次の例を見てみましょう。
Sub Main()
Dim a As Integer = 100
Dim b As Integer = 10
Dim ret As Integer = 0
tasizan(a, b, ret)
Console.WriteLine(ret)
End Sub
Sub tasizan(data1 As Integer, data2 As Integer, ByRef ans As Integer)
ans = data1 + data2
End Sub
110
今度は、関数tasizanには戻り値がなく、第3引数がByRefになっています。
戻り値が無いのに、どうやって計算結果を得ているのか、不思議ではありませんか?
その秘密はByRefキーワードにあります。
このByRefは参照渡しと言われる引数の渡し方です。
ByRefで渡された引数を、関数側で変更すると、
関数呼び出し側の変数も変更される、と言う性質を持っています。
このプログラム例だと、第3引数にretが渡され、
足し算結果をansに代入しています。
この時点で、ansは当然110になっていますが、
関数呼び出し側変数のretも同じく110になるのです。
これが参照渡しの特徴です。
一方でByRefキーワードを記述しない引数は
自動的にByVal(値渡し)になります。
ByValで渡された引数は、関数側で変更しても、
関数呼び出し側の引数の値はそのままです。
このプログラム例だと、変数a,bを引数として渡していますが、
data1,data2を変更したとしても、
変数a,bの値は変更されないと言う事です。
ByVal(値渡し)の方がプログラムの保守性が高くなるので、
事情が無い限りはByValを使うようにするのが普通です。
一方で、ByRef(参照渡し)の場合は、関数外の変数を変更できてしまうので、
バグの原因になる事もあり、あまりオススメはできません。
簡単ですが、ByValとByRefキーワードの説明でした。