下面代码运行中可以看出,不用ByRef也可以更改调用对象的值,这一点很迷路。
使用ByRef关键字才能更改调用对象,如下代码运行中MySub的参数中却能更改List1的值。
Public Class Class1
Private List1 As New List(Of String)
Sub MySub(ByVal LoadList1 As List(Of String))
LoadList1.Add("A")
LoadList1.Add("B")
LoadList1.Add("C")
End Sub
Sub MySub1()
MySub(List1)
MsgBox(List1.Count)
End Sub
End Class
------解决思路----------------------
你用基础数据类型测
------解决思路----------------------
你传的本身就是指针,那么就和 ByVal没有关系了。
------解决思路----------------------
对于引用类型,ByRef相当于传递引用的引用,ByVal相当于传递引用
要想看到ByRef和ByVal的区别,你需要在函数中让这个引用指向另一个对象。
Sub MySub(ByVal LoadList1 As List(Of String))
LoadList1 = new List(Of String)()
LoadList1.Add("A")
LoadList1.Add("B")
LoadList1.Add("C")
End Sub
MySub(List1)输出不包括ABC
修改为ByRef
MySub(List1)输出包括ABC
------解决思路----------------------
在早期的vb、c等语言中,传值就意味着“深度拷贝”,而传址就意味着“仅拷贝指针”。因此对于自定义结构,传址比传值速度快,因为不需要深度拷贝结构内容,而且函数中可以通过直接在地址上写上新的结构的指针而修改变量引用。
但是如果你研究一些.net底层机制的文档可以看到,在.net中传址比传值要慢,因为传址就意味着要将堆栈上的 LoadList1 参数重新赋值给变量 List1,而传值就意味着不赋值(而直接丢弃)。
要注意在.net中的与c语言的概念根本不同,不论是传值还是传址,在.net中传递的的 List1 都是一样的,都是引用。 msdn 文档上是有误导的。在.net中,传值和传址的概念跟c语言根本不同,不要拿着原来的那种机制来想象.net的机制。