gpt4 book ai didi

VB6 和 .NET - 数组差异

转载 作者:行者123 更新时间:2023-12-02 06:21:10 24 4
gpt4 key购买 nike

请看下面我在 VB6 和 .NET 中运行的代码:

Private Sub Form_Load()
Dim TestArray3() As String
TestArray3 = TestArrayFunction

End Sub

Private Function TestArrayFunction() As String()
Dim TestArray1(0 To 1) As String
Dim TestArray2() As String
TestArray1(0) = "Monday"
TestArray1(1) = "Tuesday"
TestArray2 = TestArray1
TestArray1(0) = "Wednesday"
End Function

当程序在 VB6 中运行到 TestArrayFunction 的末尾时,TestArray2(0) 的值是“Monday”,但是在 .NET 中运行时,它是“Wednesday”。我在 .NET 中了解到数组是一个对象,并且在 TestArrayFunction 中有两个指向它的引用。为什么在 VB6 中不是这种情况?

最佳答案

这是添加到 Dabblernl 的响应中。

长话短说,VB6 从来没有真正的通用引用类型。建立在 COM 之上,它唯一的引用类型 (Dim ... As Object) 是一种用于基于 COM(或 COM 样式)的类。 Variant 类型只擅长装箱其他类型。

至于为什么 ByRef 与数组一起工作......

许多 BASIC 方言的演变,包括 VB6,在子程序和函数方面采用/改编了 FORTRAN 的范例;即,参数通过地址传递(因此,ByRef 是默认值),函数通过值返回它们的结果。除此之外,BASIC 从未真正具有地址或引用的概念:VB6(及更早版本)将使用 32 位(有符号)整数模拟地址,否则将通过 DECLARE SUB 的特殊规则(以奇怪的方式)处理/FUNCTION 语句和(鞋拔)AddressOf 运算符和 VarPtr/StrPtr 函数。

最后说明:由于 VB6 类是 COM 样式的,因此 VB6 具有 SET 语句。这样做的原因是没有 SET,l-value = r-value 情况是隐含的 LET 语句。 COM 支持默认属性的概念(带参数和不带参数); LET objA = objB 被解释为 LET objA.DefaultPropOfA = objB.DefaultPropOfB。另一方面,SET 使 objA 引用 objB 引用的同一对象。

.NET 的 Visual Basic 是一种很好的、​​功能强大的语言,与 VB6 相比,其缺点和瑕疵要少得多。然而,它与它的传统表亲确实有很大的不同。这些差异让长期使用 VB6 的用户感到不满,我怀疑这让许多 VB.NET 用户在被要求处理 VB6 代码时感到困惑。

顺便说一句,VB6 编码器会以这种方式处理类问题中的数组:

Public Property Get DaysOfWeek(ByVal index As Integer) As String
DaysOfWeek = m_strDaysOfWeek(index)
End Property

Public Property Let DaysOfWeek(ByVal index As Integer, ByRef value As String)
m_strDaysOfWeek(index) = value
End Property

这将允许 strDay = clsDateTime.DaysOfWeek(1)clsDateTime.DaysOfWeek(2)="Tuesday" 的语法按需要工作。

关于VB6 和 .NET - 数组差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9243461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com