Я знаю, что на этот вопрос довольно много ответов, но я просто хотел добавить следующее ...
Однако объект, который вы передаете функции, подчиняется 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», вы затем указываете новую ссылку на новый объект и отсоединяетесь от списка вызывающих,И здравый смысл, и может настигнет вас однажды, так что стоит иметь в виду.