Functionの引数に「ByRef」「ByVal」と付いているのを見かけたことはありませんか?
2つがどのような役割を持っているか、サンプルコードで確認してみましょう。
引数として受け取った変数を、2倍するプログラムを書いてみます。
よく分からなければ、ByValを使え!
結論としては、基本的にByValを使いましょう。
ByRefにもメリットはありますが
安易に使うとバグや可読性の低下につながるので、極力避けるべきです。
ByValの場合
Public Function TestByVal(ByVal num As Integer) As Integer num = num * 2 Return num End Function Sub Main(args As String()) Dim hoge As Integer = 5 Dim hoge2 As Integer = 0 hoge2 = TestByVal(hoge) Console.WriteLine("hoge:" & hoge) Console.WriteLine("hoge2:" & hoge2) End Sub
実行結果:
hoge:5 hoge2:10
ByRefの場合
Public Function TestByRef(ByRef num As Integer) As Integer num = num * 2 Return num End Function Sub Main(args As String()) Dim hoge As Integer = 5 Dim hoge2 As Integer = 0 'hoge2 = TestByVal(hoge) hoge2 = TestByRef(hoge) Console.WriteLine("hoge:" & hoge) Console.WriteLine("hoge2:" & hoge2) End Sub
実行結果:
hoge:10 hoge2:10
ByRefとByValの違い
それぞれのメソッドの中で、受け取った変数をそのまま2倍していますが
以下のような違いがあります。
ByVal:引数「hoge」の値は変わらない
ByRef:引数「hoge」の値が変わっている
ByRef:引数「hoge」の値が変わっている
値渡しと参照渡し
ByVal、ByRefは以下のように分類されています。
ByVal:call by value(値渡し)
ByRef:call by reference(参照渡し)
ByRef:call by reference(参照渡し)
ByValでは変数の値をコピーして扱うのに対して
ByRefではメモリ上にある変数のアドレスを渡します。
同じアドレスを参照するので、呼び出し先で変数の値を変えると
呼び出し元の変数も変えることになってしまいます。
ByRefのメリット

新米太郎
ByRefにはどんなメリットがあるのでしょうか?
ByRefでは変数をコピーしないので
ByValに比べてメモリを使用しないというメリットがあります。
しかし、余程大きなデータを変数に入れてない限りは
ほとんどパーフォマンスは変わりません。
ByRefを使うと、思わぬところで値を変更してしまうなど
バグの原因に繋がりやすいため
特別な理由がない限りByRefは使うべきではありません。
最後に
今回はvb.netのByRefとByValのお話でした。
vb.netに限らず、プログラミング言語には細かな仕様が沢山あるので
1つ1つに疑問を持っていくと、レベルアップに繋がります!

新米太郎
お読み頂きありがとうございました!
コメント