List(T)的对象是否通过ByVal或ByRef是否重要

use*_*981 4 vb.net

在下面的示例中,如果我在ByRef或ByVal函数中传递List(T)对象,这是否重要?

这是正确的,因为List是一个引用类型,所以即使我传递对象ByVal,值也总是会改变.

如果在更新列表时我在函数"ListChanged"中传递对象byRef会更好吗?

Public Class MyClass_

    Public Sub TestMethod()

        Dim List_1 As New List(Of Integer)()
        Dim List_2 As New List(Of Integer)()

        List_1.Add(100)
        List_2.Add(50)

        List_1 = ActualListNotChanged(List_1)  '---101
        List_2 = ListChanged(List_2)        '---50,51

    End Sub


    Private Function ActualListNotChanged(ByVal lst As List(Of Integer)) As List(Of Integer)

        Dim nList As New List(Of Integer)()

        For Each item As Integer In lst
            If item <> 50 Then
                nList.Add(101)
            End If
        Next item

        Return nList

    End Function

    Private Function ListChanged(ByVal lst As List(Of Integer)) As List(Of Integer)

        lst.Add(51)
        Return lst

    End Function

End Class
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 5

在您的示例中,ByVal(默认值)是最合适的.

ByVal和ByRef都允许您修改列表(例如添加/删除项目).ByRef还允许您用不同的列表替换列表,例如

Dim List1 As New List(Of Int)
List1.Add(1)
ListReplacedByVal(List1)
' List was not replaced.  So the list still contains one item
Debug.Assert(List1.Count = 1) ' Assertion will succeed

ListReplacedByRef(List1)
' List was replaced by an empty list.  
Debug.Assert(List1.Count = 0) ' Assertion will succeed


Private Sub ListReplacedByVal(ByVal lst As List(Of Integer))
    lst = New List(Of Int)
End Sub

Private Sub ListReplacedByRef(ByRef lst As List(Of Integer))
    lst = New List(Of Int)
End Sub
Run Code Online (Sandbox Code Playgroud)

一般来说,你应该使用ByVal.您传递的对象可以被修改(在某种意义上,您可以调用其方法和属性设置器来更改其状态).但它不能被不同的对象取代.