events
引数の値渡しと参照渡し (Visual Basic)
Visual Basic では、プロシージャに引数を渡すときに、"値" 渡しまたは "参照" 渡しにすることができます。 これは "引渡し方法" と呼ばれ、引数の基になる呼び出し元のコードのプログラミング要素をプロシージャが変更できるかどうかを決定します。 プロシージャの宣言で ByVal または ByRef キーワードを指定することによって、各パラメーターの引渡し方法を決定します。
プロシージャに引数を渡すときは、相互作用するいくつかの相違点に注意してください。
基になるプログラミング要素が変更可能か変更不可能か
引数自体が変更可能か変更不可能か
引数が値渡しか参照渡しか
引数のデータ型が値型か参照型か
詳細については、「Differences Between Modifiable and Nonmodifiable Arguments (変更できる引数と変更できない引数の違い)」および「Differences Between Passing an Argument By Value and By Reference (引数の値渡しと参照渡しの違い)」をご覧ください。
引数ごとに引渡し方法を慎重に選択する必要があります。
保護。 2 つの引渡し方法のいずれかを選択する際に、最も重要な基準は、呼び出し元の変数が変更の影響を受けるかどうかです。 引数を
ByRef
で渡す利点は、プロシージャがその引数を使用して呼び出し元のコードに値を返すことができることです。 引数をByVal
で渡す利点は、プロシージャによって変更されないように変数を保護することです。パフォーマンス。 引渡し方法はコードのパフォーマンスに影響を与える可能性がありますが、通常、その違いはわずかです。 唯一の例外は、
ByVal
で渡される値型です。 この場合、Visual Basic では引数のデータ コンテンツ全体をコピーします。 そのため、構造体などの大きな値型の場合、ByRef
で渡す方が効率的です。参照型の場合、データへのポインターだけがコピーされます (32 ビット プラットフォームでは 4 バイト、64 ビット プラットフォームでは 8 バイト)。 そのため、パフォーマンスを損なうことなく、
String
またはObject
型の引数を値渡しにすることができます。
プロシージャの宣言で、各パラメーターの引渡し方法を指定します。 呼び出し元のコードは、引渡し方法 ByVal
をオーバーライドできません。
パラメーターが ByRef
で宣言されている場合、呼び出し元のコードは、呼び出しで引数名をかっこで囲むことによって、引渡し方法を強制的に ByVal
にすることができます。 詳細については、方法: 引数の値渡しを強制する」をご覧ください。
Visual Basic の既定では、引数は値渡しになります。
引数の基になる呼び出し元のコードの要素が変更不可能な要素である場合は、対応するパラメーターを ByVal で宣言します。 コードは、変更不可能な要素の値を変更することはできません。
基になる要素が変更可能であっても、プロシージャがその値を変更できないようにする場合は、パラメーターを
ByVal
で宣言します。 値渡しされた変更可能な要素の値を変更できるのは、呼び出し元のコードだけです。
プロシージャが呼び出し元のコードの基になる要素を変更する必要がある場合は、対応するパラメーターを ByRef で宣言します。
コードを正しく実行するには、呼び出し元のコードの基になる要素をプロシージャが変更する必要がある場合は、パラメーターを
ByRef
で宣言します。 値渡しにした場合や、呼び出し元のコードで引数をかっこで囲むことによって引渡し方法ByRef
をオーバーライドした場合、プロシージャ呼び出しによって予期しない結果が生じる可能性があります。
次の例は、引数を値渡しにする場合と参照渡しにする場合を示しています。 Calculate
プロシージャには、ByVal
パラメーターと ByRef
パラメーターの両方があります。 このプロシージャのタスクは、指定された rate
(金利) と debt
(合計金額) を使用して、debt
の新しい値を計算することです。これは、debt
の元の値に金利を適用した結果です。 debt
は ByRef
パラメーターであるため、新しい合計は、debt
に対応する呼び出し元のコードの引数の値に反映されます。 Calculate
が値を変更しないようにする必要があるため、rate
パラメーターは ByVal
パラメーターです。
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
.NET に関するフィードバック
.NET はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。
その他のリソース
トレーニング
モジュール
パラメーターを使用して C# メソッドを作成する - Training
このモジュールでは、参照および値渡しのパラメーター型など、メソッド パラメーターについて説明します。 このモジュールでは、省略可能および名前付き引数についても説明します。
ドキュメント
-
詳細情報: ByVal (Visual Basic)
-
詳細情報: 省略可能なパラメーター (Visual Basic)
-
方法: プロシージャ引数の値が変化しないようにする - Visual Basic
詳細情報: 方法:プロシージャ引数の値が変更されないように保護する (Visual Basic)