【问题标题】:Assignment "=" operator in VB.NET 1.1VB.NET 1.1 中的赋值“=”运算符
【发布时间】:2009-11-18 17:22:01
【问题描述】:

我在我的代码中“克隆”对象。例如:

objClone = objOriginal

我的问题是:

  1. VB.NET 1.1 中的赋值运算符是逐个成员地复制 objOriginal 到 objClone 还是 objClone 只是指向 objOriginal 引用的内存的引用?

【问题讨论】:

    标签: vb.net .net-1.1


    【解决方案1】:

    如果类型是引用类型(即:类),则它是引用副本。如果是值类型(Structure),会逐个成员复制。

    【讨论】:

    • 仅供参考 - 在较新版本的 VB.NET 以及 C# 和其他 .NET 语言中也是如此。
    【解决方案2】:

    您显示的代码会发生什么取决于objOriginal 是什么类型:

    • 如果是引用类型,objClone 将引用与objOriginal 相同的实例
    • 如果是值类型,objClone将是一个新的实例,与objOriginal的内容相同

    但请注意,如果它是一个值类型,其中任何成员都是引用类型,那么这些成员将引用与原始对象相同的实例(这称为 浅拷贝)。

    例子:

    Public Class Test
        Public Number As Integer
    End Class
    
    Dim objOriginal As New Test()
    objOriginal.Number = 42
    Dim objClone As Test
    objClone = objOriginal
    

    在这种情况下,objCloneobjOriginal 都将引用 Test 的同一个实例。

    Public Structure Test
        Public Number As Integer
    End Class
    
    Dim objOriginal As New Test()
    objOriginal.Number = 42
    Dim objClone As Test
    objClone = objOriginal
    

    在这种情况下,objCloneobjOriginal 将是 Test 的不同实例,每个实例在 Number 字段中都有自己的 Integer 实例。

    Public Class SomeValue
        Public Number As Integer
    End Class
    Public Structure Test
        Public Value As SomeValue
    End Class
    
    Dim objOriginal As New Test()
    objOriginal.Value = New SomeValue()
    objOriginal.Value.Number = 42
    Dim objClone As Test
    objClone = objOriginal
    

    在这种情况下,objCloneobjOriginal 将是 k 的两个不同实例,但两者都将通过其 Value 成员引用 SomeValue 的同一实例。

    【讨论】:

    • 哇!调试起来很麻烦。
    【解决方案3】:

    我不确定 VB,但 C# 版本的赋值只做浅拷贝。 (编辑:对于引用类型)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-02
      • 2019-10-06
      • 2011-11-16
      • 2013-11-30
      • 2015-10-02
      • 1970-01-01
      • 2014-04-17
      • 2021-01-24
      相关资源
      最近更新 更多