引数の値渡しと参照渡し (Visual Basic)Passing Arguments by Value and by Reference (Visual Basic)

Visual basic では、プロシージャに引数を渡すことができます値によってまたは参照によってです。In Visual Basic, you can pass an argument to a procedure by value or by reference. これと呼ばれますが、渡しプロシージャが呼び出し元のコードで引数の基になるプログラミング要素を変更できるかどうかを判定します。This is known as the passing mechanism, and it determines whether the procedure can modify the programming element underlying the argument in the calling code. プロシージャ宣言では、各パラメーターの引き渡し方法を決定を指定して、 ByValまたはByRefキーワード。The procedure declaration determines the passing mechanism for each parameter by specifying the ByVal or ByRef keyword.

相違点Distinctions

プロシージャに引数を渡すときの相互作用をいくつかの違いに注意してください。When passing an argument to a procedure, be aware of several different distinctions that interact with each other:

  • 基になるプログラミング要素が変更可能または変更不可能なのかどうかWhether the underlying programming element is modifiable or nonmodifiable

  • 引数自体が変更可能または変更不可能なのかどうかWhether the argument itself is modifiable or nonmodifiable

  • 値渡しまたは参照渡しの引数が渡されるかどうかWhether the argument is being passed by value or by reference

  • 引数のデータ型は、値型または参照型かどうかWhether the argument data type is a value type or a reference type

詳細については、次を参照してください。の相違点の間で変更可能なと変更できない引数の相違点の間で値と参照渡しによって引数の渡しです。For more information, see Differences Between Modifiable and Nonmodifiable Arguments and Differences Between Passing an Argument By Value and By Reference.

引き渡し方法の選択Choice of Passing Mechanism

各引数の慎重に引き渡し方法を選択してください。You should choose the passing mechanism carefully for each argument.

  • 保護です。Protection. 引数を渡す方法を選択すると、最も重要な条件を変更する変数を呼び出すことの公開です。In choosing between the two passing mechanisms, the most important criterion is the exposure of calling variables to change. 引数を渡す場合の利点ByRefは、プロシージャがその引数を呼び出し元のコードに値を返すことができます。The advantage of passing an argument ByRef is that the procedure can return a value to the calling code through that argument. 引数を渡す場合の利点ByValプロシージャによって変更されない変数を防ぐことができます。The advantage of passing an argument ByVal is that it protects a variable from being changed by the procedure.

  • パフォーマンスです。Performance. 引き渡し方法が、コードのパフォーマンスに影響を与えることができますが、違いは通常意味ではありません。Although the passing mechanism can affect the performance of your code, the difference is usually insignificant. 1 つの例外は、渡された値の型ByValです。One exception to this is a value type passed ByVal. この場合、Visual Basic では、引数の内容が全体がコピーされます。In this case, Visual Basic copies the entire data contents of the argument. そのため、構造体などの大きな値型のだということを渡す方が効率的ByRefです。Therefore, for a large value type such as a structure, it can be more efficient to pass it ByRef.

    参照型の場合は、データへのポインターのみ、コピーした (4 バイト 32 ビット プラットフォームでは、64 ビット プラットフォームでは 8 バイト) です。For reference types, only the pointer to the data is copied (four bytes on 32-bit platforms, eight bytes on 64-bit platforms). そのため、型の引数を渡すことができますStringまたはObjectパフォーマンスに悪影響を与えない値。Therefore, you can pass arguments of type String or Object by value without harming performance.

引き渡し方法の決定Determination of the Passing Mechanism

プロシージャ宣言では、各パラメーターの引き渡し方法を指定します。The procedure declaration specifies the passing mechanism for each parameter. 呼び出し元のコードがオーバーライドすることはできません、ByValメカニズムです。The calling code can't override a ByVal mechanism.

パラメーターが宣言されている場合ByRef、呼び出し元のコードにするためのメカニズムを強制できますByValを呼び出しでは、かっこで囲み、引数名によってです。If a parameter is declared with ByRef, the calling code can force the mechanism to ByVal by enclosing the argument name in parentheses in the call. 詳細については、次を参照してください。する方法: 引数を値渡しを強制です。For more information, see How to: Force an Argument to Be Passed by Value.

Visual Basic では既定では、引数の値渡しです。The default in Visual Basic is to pass arguments by value.

引数の値渡しする場合When to Pass an Argument by Value

  • 引数の基になる呼び出し元のコード要素が変更できない要素の場合は、対応するパラメーターを宣言ByValです。If the calling code element underlying the argument is a nonmodifiable element, declare the corresponding parameter ByVal. 変更不可能な要素の値は、コードでは変更されません。No code can change the value of a nonmodifiable element.

  • 基になる要素は変更できますが、その値を変更できるようにする手順をしたくない場合、パラメーターを宣言ByValです。If the underlying element is modifiable, but you do not want the procedure to be able to change its value, declare the parameter ByVal. 呼び出し元のコードだけでは、値渡し変更可能な要素の値を変更できます。Only the calling code can change the value of a modifiable element passed by value.

参照引数を渡す場合When to Pass an Argument by Reference

  • プロシージャに呼び出し元のコード内の基になる要素を変更する正規品である必要がある場合は、対応するパラメーターを宣言ByRefです。If the procedure has a genuine need to change the underlying element in the calling code, declare the corresponding parameter ByRef.

  • 正しいコードの実行は、呼び出し元のコード内の基になる要素を変更するプロシージャに依存している場合に、パラメーター宣言ByRefです。If the correct execution of the code depends on the procedure changing the underlying element in the calling code, declare the parameter ByRef. 値で渡す場合、または呼び出し元のコードをオーバーライドする場合、ByRef引数をかっこで囲んで、プロシージャの呼び出しが予期しない結果を生じる可能性があります。If you pass it by value, or if the calling code overrides the ByRef passing mechanism by enclosing the argument in parentheses, the procedure call might produce unexpected results.

Example

説明Description

引数の値渡しと参照渡しする次の例を示しています。The following example illustrates when to pass arguments by value and when to pass them by reference. プロシージャCalculate両方を持つ、ByValByRefパラメーター。Procedure Calculate has both a ByVal and a ByRef parameter. 利率、指定されたrateと合計金額、 debt、プロシージャのタスクはの新しい値を計算するdebtの元の値を利率を適用した結果はdebtします。Given an interest rate, rate, and a sum of money, debt, the task of the procedure is to calculate a new value for debt that is the result of applying the interest rate to the original value of debt. debtは、ByRefパラメーター、呼び出し元のコードに対応する引数の値で、新しい合計を反映debtです。Because debt is a ByRef parameter, the new total is reflected in the value of the argument in the calling code that corresponds to debt. パラメーターrateは、ByValパラメーターのためCalculateその値を変更しないでください。Parameter rate is a ByVal parameter because Calculate should not change its value.

コードCode

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

関連項目See Also

手順Procedures
プロシージャのパラメーターと引数Procedure Parameters and Arguments
方法: プロシージャに引数を渡すHow to: Pass Arguments to a Procedure
方法: プロシージャ引数の値を変更するHow to: Change the Value of a Procedure Argument
方法: プロシージャ引数の値が変化しないようにするHow to: Protect a Procedure Argument Against Value Changes
方法: 引数の値渡しを強制するHow to: Force an Argument to Be Passed by Value
位置と名前による引数渡しPassing Arguments by Position and by Name
値型と参照型Value Types and Reference Types