vb6 - 旧版 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
代码取决于value
被Calculate
Sub 更改以达到“成功”。在原始项目中,如果这不起作用,则有数百行代码将无法访问。
所以问题是,有没有办法在value
不使用 ByRef 的情况下通过引用传递,同时仍然使用整数类型?还是我试图理解的代码完全错误?
在代码库中,作者没有使用明确的 ByRef 或 ByVal 语句。变量使用类型字符声明,但子例程参数缺少类型声明。我不确定使用的 Visual Basic 版本。在主文件中,第一条语句是VERSION 5.00
.
当我在 Visual Studio 中打开代码时,参数的类型显示为Object
. 所以要么 Visual Studio 知道我不知道的东西,要么这只是因为参数缺少类型声明。
我还拥有该软件的编译版本,它产生的结果看起来不错。因此,当我完成了对代码的转录后,我至少可以对照原件检查结果。
解决方案
默认的参数传递是 ByRef。您只需指定 ByVal 参数。
至于在 Visual Studio 中转换为 Object 的参数类型,这是因为 Visual Basic 中的默认类型是“Variant”,从所有意图和目的来看,它都映射到 System.Object 类型。
推荐阅读
- html - 如何修复溢出其容器的图像?
- django - 如何使用 formset 在 django 上为一篇文章上传几张图片
- sql - 如果事务在 Postgresql 中处于可重复读取隔离级别,事务是否会看到来自另一个并发事务的插入?
- python-3.x - MovieWriter (ffmpeg) 不可用 PyCharm (Windows)
- unicode - 在 Couchbase Java Query DSL 中,如何过滤不是 ASCII 的字段值?
- python - 为什么类在调用类 __init__ 时访问其元类中的变量?
- python - 查找沿线的点密度以找到具有最大浓度的区域
- php - 如何创建一个集合(或数组)列出所有父母和他们的孩子传递给一个视图
- reactjs - 有没有办法将组件引用存储在状态中?还是更“反应”的选择?
- matlab - 如何将 "spectrogram(x,512,256,512,Fs,'yaxis')" 转换为八度 "specgram" 函数?