VB6和.NET - 数组差异

w00*_*977 2 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) = "Monday"
    TestArray1(1) = "Tuesday"
    TestArray2 = TestArray1
    TestArray1(0) = "Wednesday"
End Function
Run Code Online (Sandbox Code Playgroud)

当程序在VB6中到达TestArrayFunction的末尾时,TestArray2(0)的值是"星期一",但是当在.NET中运行时,它是"星期三".我在.NET中理解,Array是一个对象,并且在TestArrayFunction中有两个引用它的引用.为什么在VB6中不是这种情况?

rsk*_*kar 7

这是为了增加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值= 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
Run Code Online (Sandbox Code Playgroud)

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