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

时间:2013-11-13 12:17:54

标签: 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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

我会说最好的做法是使用ByRef传递,如果(并且仅当)你要更改列表。不是很长的答案,但它简短而甜蜜!