2009-11-18 3 views
1

Я «клонирую» объекты в своем коде. Например:Назначение оператора «=» в VB.NET 1.1

objClone = objOriginal 

Мой вопрос:

  1. ли оператор присваивания в VB.NET 1.1 сделать член-на-член копию objOriginal в objClone или же objClone просто указать в качестве ссылки в память, на которую ссылается objOriginal?

ответ

5

Это ссылочная копия, если тип является ссылочным типом (то есть: классы). Если это тип значения (Structure), он будет выполнять член по членской копии.

+0

Вот что я думал. – Achilles

+0

FYI - это то же самое в новых версиях VB.NET, а также на C# и других языках .NET. –

0

Я не уверен относительно VB, но версия назначения C# имеет только мелкую копию. (Изменить: для ссылочных типов).

3

Что происходит с кодом, который вы показываете зависит от того, какой тип objOriginal является:

  • Если это ссылочный тип, objClone будет ссылаться на один и тот же экземпляр, как objOriginal
  • Если это тип значения, objClone будет новый экземпляр, с тем же содержанием, как objOriginal

Примечание, хотя, если это тип значения, имеющие какие-либо членов, являющихся ссылочными типами, эти члены Виль l ссылаются на те же экземпляры, что и исходный объект (это называется мелкой копии).

Примеры:

Public Class Test 
    Public Number As Integer 
End Class 

Dim objOriginal As New Test() 
objOriginal.Number = 42 
Dim objClone As Test 
objClone = objOriginal 

В этом случае objClone и objOriginal оба будут ссылаться на один и тот же экземпляр Test.

Public Structure Test 
    Public Number As Integer 
End Class 

Dim objOriginal As New Test() 
objOriginal.Number = 42 
Dim objClone As Test 
objClone = objOriginal 

В этом случае objClone и objOriginal будут разные экземпляры Test, каждый со своим собственным Integer например, в Number поле.

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 

В этом случае objClone и objOriginal будут две разные случаи к, но оба будут ссылаться на один и тот же экземпляр SomeValue через их члена Value.

+0

Ничего себе! Это отладочная проблема для отладки. – Achilles

Смежные вопросы