调用带有byref参数的属性的函数会导致设置方法调用

时间:2019-03-08 11:28:56

标签: vb.net properties function-call byref

在调用以ref为声明的属性作为参数的函数时,该属性的set方法在函数调用后执行。

如果您尝试使用ref将属性传递给函数,则会在c#中抛出编译器错误,但是在vb.net中会通过。这是错误吗?发生了什么事?

Module Module1

    Private _testProp As Integer
    Property testProp As Integer
        Get
            Return _testProp
        End Get
        Set(value As Integer)
            Console.WriteLine("changed TestProp to " & value.ToString())
            _testProp = value
        End Set
    End Property

    Private Sub testFunction(ByRef arg As Integer)
        Console.WriteLine(arg)
    End Sub

    Sub Main()
        Console.WriteLine("explicit set to 5 in main")
        testProp = 5
        Console.WriteLine("calling function")
        testFunction(testProp)
        Console.ReadKey()
    End Sub

End Module

输出:

  

显式设置为main
5   将TestProp更改为5
  调用函数
  5
  将TestProp更改为5

1 个答案:

答案 0 :(得分:0)

将属性传递给ByRef参数会导致该属性通过复制/复制输出传递。 VB语言规范指出,

  

复制入复制回。如果传递给参考参数的变量的类型与参考参数的类型不兼容,或者将非变量(例如,属性)作为参数传递给参考参数,或者调用是晚绑定的,然后分配一个临时变量并将其传递给引用参数。传入的值将在调用该方法之前复制到此临时变量中,并在该方法返回时复制回原始变量(如果有的话并且可写)。

所以这显然是设计使然,而不是错误。