19

違いはなんですか?私はいつもByValを使用していますが、いつすべきか、いつすべきでないかについてはよくわかりません...

4

9 に答える 9

13

ByRef=あなたはあなたの友人にあなたのタームペーパー(オリジナル)を渡し、彼はそれをマークアップしてあなたに返すことができます。

ByVal=あなたは彼にタームペーパーのコピーを渡し、彼はあなたに彼の変更を返しますが、あなたはそれらをあなた自身で元に戻さなければなりません。

私がそれを作ることができるのと同じくらい簡単です。

ByRefを使用する理由:
ByRefは、渡すオブジェクトにPOINTERを渡します。同じメモリ空間にいる場合、これはオブジェクトではなく「単語」だけを渡すことを意味します。渡すメソッドは、元のオブジェクトに変更を加えることができ、元のオブジェクトにあるため、元のオブジェクトに戻す必要はありません。大きなデータパスを高速化するのに便利です。ByRefを使用して、オブジェクトを返す必要がないため、FUNCTION(VB内)ではなくSUBを使用できるようにすることもできます。

ByRefを使用しない理由:
メソッドは元のメソッドにアクセスできるため、加えられた変更は即座に永続的になります。メソッドが失敗すると、オブジェクトが破損する可能性があります。ByValを使用すると、コピーが作成され、コピー全体がメソッドに渡されます。その後、メソッドは情報を処理し、コピーを返すか、情報を報告するか、何もしません。

于 2011-03-09T18:08:52.103 に答える
11

参照を渡す場合、メソッドの値を変更すると、呼び出しサイトの変数も変更されます。

値を渡す場合は、メソッドで別の変数を作成した場合と同じであるため、変更しても元の (呼び出し側の) 変数の値は変更されません。

したがって、実際には、通常は変数を値として渡す必要があります。明示的にそうする必要がある場合にのみ、参照として渡します。

于 2011-02-05T18:23:26.993 に答える
5

この質問はほとんど答えられていることは知っていますが、次のことを追加したかっただけです...

関数に渡すオブジェクトは 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」と指定した時点で、新しいオブジェクトへの新しい参照がポイントされ、呼び出し元から切り離されます。リスト。常識といつかあなたを捕まえるかもしれないので、心に留めておくべきことがあります。

于 2011-04-19T14:57:43.857 に答える
5

ByRef は、2 番目の戻り値のようなものです。オブジェクト自体ではなく、オブジェクトへの参照を関数に渡します。関数内のパラメーターの値を変更するByRefと、関数の終了後にそれらの変更が表示されます。それが十分に明確でない場合は、これとこれを読んでください。

于 2011-02-05T18:26:28.697 に答える
0

これがあなたの質問に答えることを願っています

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
于 2015-10-30T10:40:53.720 に答える