ByRef vs ByVal产生错误!

我有一个使用对象的方法

Function Foo(ByRef bar as CustomObject) as Boolean


此方法产生错误,因为一些奇怪的.NET Runtime事物更改了bar对象,从而导致其Dispose()al。

花费很多时间来了解事物(更改...对象),直到有人将ByRef替换为ByVal并且传递给该方法时对象不再改变为止。

有人可以解释一下,会发生什么?

Nota Bene(编辑)

就我而言,函数Foo不会修改barByRefByVal是否应该具有相同的效果?

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

10-08 19:29