背景:我有一组共享公共“接口”的VB6 DLL。无论在本地安装哪个版本,都可以通过COM互操作调用此接口的成员(从VB.Net代码,我怀疑这可能很重要)。今天我注意到,调用之一将[我理解为]右值(以下称为“右值”)传递给VB6函数,该函数没有将该特定参数定义为ByVal
。
示例代码:
VB6:
Public Function VB6Function(input As String) As String
' Do interesting things with input
End Function
VB.Net:
' get an instance of the VB6 class and pass our trimmed localString to it
result = vb6Instance.VB6Function(localString.Trim())
' Do interesting things with localString
我还没有注意到VB6代码的实例更改了input
的值,但是我也没有详尽搜索不同的DLL实现(有数百种)。
[当VB6Function
为“右值”时,如果input
更改了input
的值,会发生什么?为此,为什么在传递“右值”时此方法调用不会简单地出错?]
如果输入为“右值”时,如果VB6Function更改了输入的值,会发生什么?
没事。或更确切地说,没什么有趣的。
当被调用函数更改其参数的值时,无论该参数是由byval还是byref提供的,对于该函数而言,[[对于内部而言]]都没有区别。重要的是存在某个类型的变量,因此可以对其进行操作。
为此,为什么在传递“右值”时,此方法调用为什么不简单地出错?
为什么会出错?传递的参数是正确的类型(字符串),这很重要。
VB中没有右值的概念。当您将所谓的右值传递给通过引用接受某些内容的方法时,编译器会自动将引用传递到右值实际驻留的临时位置。该方法通过byref获取其值,调用者并不关心指针。