VB6和.NET-数组差异

VB6和.NET-数组差异,vb6,Vb6,请看一下我在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)

请看一下我在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)的值为“星期一”,而在.NET中运行时,则为“星期三”。我在.NET中了解到数组是一个对象,在TestArrayFunction中有两个指向它的引用。为什么VB6中不是这种情况?

VB6复制数组,而函数的最后一条语句只更改原始副本


既然你知道.Net破坏了与VB的兼容性,我就不知道这种混乱是从哪里来的。

我几乎每天都在努力解决这个问题。虽然完全可以将数组ByRef传递给函数调用,但“=”符号将生成浅拷贝。 但是VB6中的数组有更奇怪的行为,假设您在VB6中有以下DateTimeClass类模块:

Option Explicit

Private m_strDaysOfWeek() As String

Public Property Get DaysOfWeek() As String()

    DaysOfWeek = m_strDaysOfWeek()

End Property

Public Property Let DaysOfWeek(strDaysOfWeek() As String)

    m_strDaysOfWeek() = strDaysOfWeek

End Property

Private Sub Class_Initialize()
    ReDim m_strDaysOfWeek(7)
    m_strDaysOfWeek(1) = "Monday"
End Sub
您希望能够编写如下代码:

Dim clsDateTime As New DateTimeClass
Dim strDay As String

strDay = clsDateTime.DaysOfWeek(1)
或:

但你不能。你必须这样做:

Dim clsDateTime As New DateTimeClass
Dim strDay As String
Dim strDays() As String

strDays = clsDateTime.DaysOfWeek
strDay = strDays(1)
strDays(2) = "Tuesday"
clsDateTime.DaysOfWeek = strDays
VB6团队当时实施它的原因是什么?我不知道。。。
我放弃了VB6数组,几乎只使用集合和字典。

这是对Dabblernl回应的补充

长话短说,VB6从来没有真正的通用引用类型。基于COM构建,它唯一的引用类型(Dim…As Object)是基于COM(或COM样式)的类的引用类型。变体类型只擅长于装箱其他类型

至于ByRef为什么使用数组

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

最后注意:由于VB6类是COM样式的,所以VB6具有SET语句。这是因为没有集合,l值=r值的情况是一个隐含的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)=“星期二”
的语法按需要工作。

@Dabbernl,谢谢。这是有道理的。我的一个问题是关于使用擦除关键字。在Vb.net中,可以将数组设置为“无”,但在vb6中不能这样做。vb6数组是对象吗?Thanks@w0051977看来他们不是。不过,我想找一些关于这方面的文档。那么您正在尝试将您的技能从VB.Net“反向迁移”到VB6,也许只是为了一个项目?通过阅读帮助VB6用户学习VB.Net的材料,您可以了解VB6和VB.Net之间的差异。可能会帮助您推断VB6是如何工作的。另外还有一种方法是为有经验的程序员学习VB6。从.net或Java时代开始,VB6的黄金时代还为时过早。Visual Basic是微软的第三代事件驱动编程语言和集成开发环境(IDE),其组件对象模型(COM)编程模型于1991年首次发布,最终版本为1998年的第6版(VB6),并于2008年宣布为遗留版本。Visual Basic.net是2002年首次发布的.net框架(如C或F)的一部分。
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