首页 > 解决方案 > 旧版 Visual Basic 代码中的隐式 ByRef

问题描述

我必须从旧版 Visual Basic 软件中复制一个算法,而且代码有一点我不明白。

似乎作者使用了某种方式通过引用隐式传递整数等简单数据类型。第一次我认为这可能是原始软件中的错误,但在第三次出现之后,它看起来是故意的。

我无法运行和调试原始(VB6 或更早版本)代码。在我试图重现行为(使用 VB.NET)的每个简单代码示例中,它总是按值传递,除非明确使用 ByRef。

我做了一个例子:

Option Explicit

Module VBModule
    Public Sub Calculate(value)
        value = value + 1
    End Sub

    Function Starter()
        Dim value%
        Call Calculate(value)
        If value > 0 Then
            Console.WriteLine("Success")
        End If
        Console.WriteLine(value)
    End Function

    Sub Main()
        Call Starter()
    End Sub
End Module

代码取决于valueCalculateSub 更改以达到“成功”。在原始项目中,如果这不起作用,则有数百行代码将无法访问。

所以问题是,有没有办法在value不使用 ByRef 的情况下通过引用传递,同时仍然使用整数类型?还是我试图理解的代码完全错误?

在代码库中,作者没有使用明确的 ByRef 或 ByVal 语句。变量使用类型字符声明,但子例程参数缺少类型声明。我不确定使用的 Visual Basic 版本。在主文件中,第一条语句是VERSION 5.00.

当我在 Visual Studio 中打开代码时,参数的类型显示为Object. 所以要么 Visual Studio 知道我不知道的东西,要么这只是因为参数缺少类型声明。

我还拥有该软件的编译版本,它产生的结果看起来不错。因此,当我完成了对代码的转录后,我至少可以对照原件检查结果。

标签: vb6pass-by-referencereverse-engineeringbasicbyref

解决方案


默认的参数传递是 ByRef。您只需指定 ByVal 参数。

至于在 Visual Studio 中转换为 Object 的参数类型,这是因为 Visual Basic 中的默认类型是“Variant”,从所有意图和目的来看,它都映射到 System.Object 类型。


推荐阅读