次の方法で共有


値と参照による引数の受け渡し (Visual Basic)

Visual Basic では、 または 参照によってプロシージャに引数を渡すことができます。 これは 受け渡しメカニズムと呼ばれ、プロシージャが呼び出し元のコードの引数の基になるプログラミング要素を変更できるかどうかを決定します。 プロシージャ宣言では、 ByVal キーワードまたは ByRef キーワードを指定して、各パラメーターの受け渡しメカニズムを決定します。

区別

プロシージャに引数を渡す場合は、相互に作用するいくつかの異なる違いに注意してください。

  • 基になるプログラミング要素が変更可能か変更不可か

  • 引数自体が変更可能か変更不可か

  • 引数が値渡しか参照渡しか

  • 引数データ型が値型か参照型か

詳細については、「 変更可能な引数と変更できない引数の違い 」および「値渡しと 参照渡しによる引数の受け渡しの違い」を参照してください

受渡しメカニズムの選択

各引数に渡すメカニズムは慎重に選択する必要があります。

  • 保護。 2 つの受け渡しメカニズムのいずれかを選択する際に最も重要な条件は、変更する呼び出し元の変数の公開です。 引数 ByRef 渡す利点は、プロシージャがその引数を使用して呼び出し元のコードに値を返すことができる点です。 引数 ByVal 渡す利点は、プロシージャによって変数が変更されないように保護することです。

  • パフォーマンス。 受け渡しメカニズムはコードのパフォーマンスに影響を与える可能性がありますが、通常、違いは重要な意味を持つわけではありません。 これに対する例外の 1 つは、 ByVal渡される値型です。 この場合、Visual Basic は引数のデータ内容全体をコピーします。 したがって、構造体などの大きな値型の場合は、 ByRef渡す方が効率的です。

    参照型の場合、データへのポインターのみがコピーされます (32 ビット プラットフォームでは 4 バイト、64 ビット プラットフォームでは 8 バイト)。 したがって、パフォーマンスを損なうことなく、値によって String または Object 型の引数を渡すことができます。

受渡し機構の決定

プロシージャ宣言では、各パラメーターの受け渡しメカニズムを指定します。 呼び出し元のコードは、 ByVal メカニズムをオーバーライドできません。

パラメーターが ByRef で宣言されている場合、呼び出し元のコードは、呼び出しの中で引数名をかっこで囲むことで、メカニズムを強制的に ByVal できます。 詳細については、「 方法: 引数を強制的に値渡しする」を参照してください。

Visual Basic の既定値は、引数を値で渡すことです。

引数を値で渡すタイミング

  • 引数の基になる呼び出し元のコード要素が変更不可能な要素である場合は、対応するパラメーター ByVal を宣言します。 変更できない要素の値を変更できるコードはありません。

  • 基になる要素が変更可能であっても、プロシージャがその値を変更できないようにする場合は、パラメーター ByVal宣言します。 呼び出し元のコードのみが、値渡しされる変更可能な要素の値を変更できます。

引数を参照渡しするタイミング

  • プロシージャで呼び出し元のコードの基になる要素を変更する必要がある場合は、対応するパラメーター ByRef を宣言します。

  • コードの正しい実行が呼び出し元のコードの基になる要素を変更するプロシージャに依存する場合は、パラメーター ByRef宣言します。 値で渡す場合、または呼び出し元のコードが引数をかっこで囲んで ByRef 受け渡しメカニズムをオーバーライドした場合、プロシージャ呼び出しによって予期しない結果が発生する可能性があります。

説明

次の例は、引数を値渡しするタイミングと、引数を参照渡しするタイミングを示しています。 プロシージャ Calculate には、 ByValByRef パラメーターの両方があります。 金利、rate、合計金額debt、プロシージャのタスクは、debtの元の値に金利を適用した結果であるdebtの新しい値を計算することです。 debtByRef パラメーターであるため、新しい合計は、debtに対応する呼び出し元コードの引数の値に反映されます。 パラメーター rateByVal パラメーターです。値 Calculate 変更しないでください。

コード

Module Module1

    Sub Main()
        ' Two interest rates are declared, one a constant and one a 
        ' variable.
        Const highRate As Double = 12.5
        Dim lowRate = highRate * 0.6

        Dim initialDebt = 4999.99
        ' Make a copy of the original value of the debt.
        Dim debtWithInterest = initialDebt

        ' Calculate the total debt with the high interest rate applied.
        ' Argument highRate is a constant, which is appropriate for a 
        ' ByVal parameter. Argument debtWithInterest must be a variable
        ' because the procedure will change its value to the calculated
        ' total with interest applied.
        Calculate(highRate, debtWithInterest)
        ' Format the result to represent currency, and display it.
        Dim debtString = Format(debtWithInterest, "C")
        Console.WriteLine("What I owe with high interest: " & debtString)

        ' Repeat the process with lowRate. Argument lowRate is not a 
        ' constant, but the ByVal parameter protects it from accidental
        ' or intentional change by the procedure. 

        ' Set debtWithInterest back to the original value.
        debtWithInterest = initialDebt
        Calculate(lowRate, debtWithInterest)
        debtString = Format(debtWithInterest, "C")
        Console.WriteLine("What I owe with low interest:  " & debtString)
    End Sub

    ' Parameter rate is a ByVal parameter because the procedure should
    ' not change the value of the corresponding argument in the 
    ' calling code. 

    ' The calculated value of the debt parameter, however, should be
    ' reflected in the value of the corresponding argument in the 
    ' calling code. Therefore, it must be declared ByRef. 
    Sub Calculate(ByVal rate As Double, ByRef debt As Double)
        debt = debt + (debt * rate / 100)
    End Sub

End Module

こちらも参照ください