在下面的例子中,如果我在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
答案 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传递,如果(并且仅当)你要更改列表。不是很长的答案,但它简短而甜蜜!