【发布时间】:2019-03-08 11:28:56
【问题描述】:
当调用一个以属性为参数的函数时,该属性的 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
【问题讨论】:
-
由于是通过ByRef,方法~could~改变原来的值,但实际上不知道值是否改变;因此它在方法调用之后更新属性以确保它具有最新值。看起来像“ByRef by Illusion,还有一个你需要注意的怪癖?我只是在这里猜测,因为我找不到任何关于此的实际文档。=/
-
因为通过引用传递引用类型使得被调用的方法能够替换调用setter的对象。被调用的方法“可能”改变这个值,它可能不太清楚,所以在实际使用它之前就已经设置好了。
-
@Çöđěxěŕ 不幸的是,帮助中似乎没有记录这种行为。我已经检查了你的两个链接。
-
@Craig 我的链接不正确(复制粘贴错误),但通常 ByRef 属性指定参数的值将在方法执行完成时更新......所以在这个如果属性设置器在方法中使用之前就被调用(创建新对象)......这样做实际上很好,当您传递属性并且另一个线程在您的方法获得您 期待,现在不一样了;因此为什么实际调用了 setter。
标签: vb.net properties function-call byref