在调用以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
答案 0 :(得分:0)
将属性传递给ByRef
参数会导致该属性通过复制/复制输出传递。 VB语言规范指出,
复制入复制回。如果传递给参考参数的变量的类型与参考参数的类型不兼容,或者将非变量(例如,属性)作为参数传递给参考参数,或者调用是晚绑定的,然后分配一个临时变量并将其传递给引用参数。传入的值将在调用该方法之前复制到此临时变量中,并在该方法返回时复制回原始变量(如果有的话并且可写)。
所以这显然是设计使然,而不是错误。