VB.NET ByValとは?ByRefとは?値渡し 参照渡し

関数、メソッドの引数にByValByRefと書いてある場合がありますが、
どういう意味か知っているでしょうか?

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キーワードの説明でした。