佐々木屋

技術的なことから趣味まで色々書きます

ここがダメだよ!VB.NET③(参照渡しの曖昧さ)

メソッドの引数は主にByValの値渡しとByRefの参照渡しがあります。

VB.NETでは以下は等価です。

Private Sub Test(ByVal num As Integer)
Private Sub Test(num As Integer)

ByValの省略は意見が分かれますが、正直どちらでも私はいいと思います。ただ、VB6の場合だとByVal省略の場合ByRefになってしまう名残から、VB.NETでも省略せず書いた方が勘違いが少ないのでは、という考えから書くべきという流れになっていると思われます。

ちなみにC#の場合はByValに相当するものはありません。何も指定しなければ値渡しとなります。

private void Test(int num) {

そういった点から考えれば、VB.NETも省略して書いた方がよりスマートのような気さえします。


さて。今回気になっていることはByValの省略ではなくByRefの方です。
値渡しより参照渡しの方が副作用が大きいのは分かると思います。ということはByRefは少し注意しなければならない存在ですが、問題はメソッドを呼ぶ場合です。

C#の場合、参照渡しの引数は明示的にrefをつけなればコンパイルエラーになります。

private void Test(ref int num) {
    //~
}

public void Main() {
    int res = 0;
    Test(ref res);
}

つまり、メソッドの呼び出し時点で参照渡しがはっきりと分かる仕組みになっています。

しかし、VB.NETは以下のように参照渡しも値渡しも同じなので、パッと見分かりにくいのです。

Private Sub Test(ByRef num As Integer)
    '~
End Sub

Public Sub Main()
    Dim res As Integer = 0
    Test(res)
End Sub