ByRef
vs ByVal
产生错误!
我有一个使用对象的方法
Function Foo(ByRef bar as CustomObject) as Boolean
此方法产生错误,因为一些奇怪的.NET Runtime事物更改了
bar
对象,从而导致其Dispose()al。花费很多时间来了解事物(更改...对象),直到有人将
ByRef
替换为ByVal
并且传递给该方法时对象不再改变为止。有人可以解释一下,会发生什么?
Nota Bene(编辑)
就我而言,函数
Foo
不会修改bar
,ByRef
或ByVal
是否应该具有相同的效果?Foo
只是从bar
读取属性。码:
Module Module1
Sub Main()
Dim b As New Bar
' see the output bellow '
Foo(b.Name)
Console.ReadLine()
End Sub
Function Foo(ByRef name As String) As Boolean
Console.WriteLine("Name is : '{0}'", name)
End Function
Class Bar
Private _Name As String = "John"
Property Name()
Get
Return _Name
End Get
Set(ByVal value)
If _Name IsNot Nothing Then
'_Name.Dispose() If this were an IDisposable, would have problems here'
End If
Console.WriteLine("Name is Changed to '{0}'", value)
End Set
End Property
End Class
End Module
输出:
名字是:'John'
名称更改为“ John”
最佳答案
在VB.NET中,通过引用传递属性会更新实际属性,而不是基础值。因此,当Foo完成时,CLR调用Property Set方法以使用函数末尾的新值更新该属性值(即使它没有更改)。
VB.NET语言规范(参考参数部分,后三段)中对此行为进行了描述:
http://msdn.microsoft.com/en-us/library/aa711958(v=VS.71).aspx