関数の参照渡し ByRef [VB]

VB2012-2017

ByRef 引数

VB関数(FunctionとSub)の引数の結果を、呼び出し元の引数の値に反映させるためには、次のようにByRef(参照渡し)を記述します。

関数には呼び出し元の変数がそのまま渡される(参照渡し)ので、関数内で引数の値を変更すると、それは、呼び出し元の変数の値を変更したことになります。

  Public Function 関数名(ByRef 引数名 As データ型) As 戻値データ型
      .................
      ..............
  End Function

ByRef の注意点は、関数内で引数の値を変更すると、関数処理の後、変更した引数の値を保持しているので、それに気づかずに思わぬミスをすることです。

関数の引数は、できるだけ値渡しのByVal を使うようにしましょう。

ByRef サンプルプログラム

関数の引数にByRefを使って、商品の税込価格から消費税を計算し、消費税額を画面に表示するプログラムを作成します。

ソースリストの枠内をクリックすると全選択できます。

Module Module1

    Sub Main()
        ' 変数の宣言
        Dim inStr As String
        Dim zeikomiKakaku As Double
        ' キーボードから商品の税込み価格を入力
        Console.WriteLine("税込み価格を入力して")
        Console.WriteLine("Enterキーを押してください")
        InStr = Console.ReadLine()
        ' 文字列を整数に変換
        zeikomiKakaku = Integer.Parse(inStr)

        ' 消費税額を求めて画面に表示
        Dim zeiGaku As Integer = 0
        ' 引数zeiGakuをByRefで関数に渡す
        CalucZeigaku(zeikomiKakaku, zeiGaku)
        Console.WriteLine("消費税は" & zeiGaku & "円です")
    End Sub

    '***************************************************************
    ' 機能:消費税額を計算する関数
    ' 引数1:税込価格zeikomiKaKaku[ByVal]
    ' 引数2:消費税額zeiGaku[ByRef]
    '******1*********2*********3*********4*********5**********6*****
    Public Sub CalucZeigaku(ByVal zeikomiKaKaku As Integer, ByRef zeiGaku As Integer)
        Dim hontaiKakaku As Double = 0
        ' 消費税額を求める
        hontaiKakaku = zeikomiKaKaku / 1.08    ' 本体価格は四捨五入
        zeiGaku = zeikomiKaKaku - hontaiKakaku
    End Sub

End Module

プログラムを実行すると、0だったzeiGakuは、関数の中で消費税が計算されて戻ってくるので、消費税が表示されます。

しかし、関数の引数にByRefを使うと、関数の中でどのように引数が変更されるか知らないと、バグの元になりかねません。

繰り返しになりますが、関数の引数は、できる限りByValを使うようにしてください。