違いはなんですか?私はいつもByValを使用していますが、いつすべきか、いつすべきでないかについてはよくわかりません...
9 に答える
ByRef
=あなたはあなたの友人にあなたのタームペーパー(オリジナル)を渡し、彼はそれをマークアップしてあなたに返すことができます。
ByVal
=あなたは彼にタームペーパーのコピーを渡し、彼はあなたに彼の変更を返しますが、あなたはそれらをあなた自身で元に戻さなければなりません。
私がそれを作ることができるのと同じくらい簡単です。
ByRefを使用する理由:
ByRefは、渡すオブジェクトにPOINTERを渡します。同じメモリ空間にいる場合、これはオブジェクトではなく「単語」だけを渡すことを意味します。渡すメソッドは、元のオブジェクトに変更を加えることができ、元のオブジェクトにあるため、元のオブジェクトに戻す必要はありません。大きなデータパスを高速化するのに便利です。ByRefを使用して、オブジェクトを返す必要がないため、FUNCTION(VB内)ではなくSUBを使用できるようにすることもできます。
ByRefを使用しない理由:
メソッドは元のメソッドにアクセスできるため、加えられた変更は即座に永続的になります。メソッドが失敗すると、オブジェクトが破損する可能性があります。ByValを使用すると、コピーが作成され、コピー全体がメソッドに渡されます。その後、メソッドは情報を処理し、コピーを返すか、情報を報告するか、何もしません。
参照を渡す場合、メソッドの値を変更すると、呼び出しサイトの変数も変更されます。
値を渡す場合は、メソッドで別の変数を作成した場合と同じであるため、変更しても元の (呼び出し側の) 変数の値は変更されません。
したがって、実際には、通常は変数を値として渡す必要があります。明示的にそうする必要がある場合にのみ、参照として渡します。
この質問はほとんど答えられていることは知っていますが、次のことを追加したかっただけです...
関数に渡すオブジェクトは ByRef/ByVal の影響を受けますが、そのオブジェクトに他のオブジェクトへの参照が含まれている場合は、ByRef/ByVal に関係なく、呼び出されたメソッドによって変更できます。説明が不十分です。理解を深めるために、以下のコードを参照してください。
Public Sub Test()
Dim testCase As List(Of String) = GetNewList()
ByRefChange1(testCase)
'testCase = Nothing
testCase = GetNewList()
ByValChange1(testCase)
'testCase is unchanged
testCase = GetNewList()
ByRefChange2(testCase)
'testCase contains the element "ByRef Change 2"
testCase = GetNewList()
ByValChange2(testCase)
'testCase contains the element "ByVal Change 2"
End Sub
Public Function GetNewList() As List(Of String)
Dim result As List(Of String) = New List(Of String)
result.Add("Value A")
result.Add("Value B")
result.Add("Value C")
Return result
End Function
Public Sub ByRefChange1(ByRef aList As List(Of String))
aList = Nothing
End Sub
Public Sub ByValChange1(ByVal aList As List(Of String))
aList = Nothing
End Sub
Public Sub ByRefChange2(ByRef aList As List(Of String))
aList.Add("ByRef Change 2")
End Sub
Public Sub ByValChange2(ByVal aList As List(Of String))
aList.Add("ByVal Change 2")
End Sub
編集:
また、この関数が呼び出されたかどうかを検討してください。
Public Sub ByValChange3(ByVal aList As List(Of String))
aList.Add("ByVal Change 3")
aList = New List(Of String)
aList.Add("ByVal Change 4")
End Sub
この場合、「ByVal Change 3」が呼び出し元リストに追加されますが、「aList = New List」と指定した時点で、新しいオブジェクトへの新しい参照がポイントされ、呼び出し元から切り離されます。リスト。常識といつかあなたを捕まえるかもしれないので、心に留めておくべきことがあります。
これがあなたの質問に答えることを願っています
Sub last_column_process()
Dim last_column As Integer
last_column = 234
MsgBox last_column
trying_byref x:=last_column
MsgBox last_column
trying_byval v:=last_column
MsgBox last_column
End Sub
Sub trying_byref(ByRef x)
x = 345
End Sub
Sub trying_byval(ByRef v)
v = 555
End Sub