【vb.net】 ByRefとByValの違い この2つは何が違うのか?

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」の値が変わっている

 

値渡しと参照渡し

ByVal、ByRefは以下のように分類されています。

ByVal:call by value(値渡し)
ByRef:call by reference(参照渡し)

ByValでは変数の値をコピーして扱うのに対して
ByRefではメモリ上にある変数のアドレスを渡します。

同じアドレスを参照するので、呼び出し先で変数の値を変えると
呼び出し元の変数も変えることになってしまいます。

 

ByRefのメリット

 

新米太郎
新米太郎

ByRefにはどんなメリットがあるのでしょうか?

 

ByRefでは変数をコピーしないので
ByValに比べてメモリを使用しないというメリットがあります。

しかし、余程大きなデータを変数に入れてない限りは
ほとんどパーフォマンスは変わりません。

ByRefを使うと、思わぬところで値を変更してしまうなど
バグの原因に繋がりやすいため

特別な理由がない限りByRefは使うべきではありません。

 

最後に

今回はvb.netのByRefとByValのお話でした。

vb.netに限らず、プログラミング言語には細かな仕様が沢山あるので

1つ1つに疑問を持っていくと、レベルアップに繋がります!

 

新米太郎
新米太郎

お読み頂きありがとうございました!




コメント

タイトルとURLをコピーしました