views:

279

answers:

3

I'm "cloning" objects in my code. For instance:

objClone = objOriginal

My question is:

  1. Does the assignment operator in VB.NET 1.1 do a member-by-member copy of the objOriginal to objClone or does objClone simply point as a reference to memory referenced by objOriginal?
A: 

I'm not sure about VB, but the C# version of assignment only does a shallow copy. (Edit: For reference types).

Broam
+5  A: 

It's a reference copy, if the type is a reference type (ie: classes). If it's a value type (Structure), it will do a member by member copy.

Reed Copsey
That's what I was thinking.
Achilles
FYI - this is the same in newer versions of VB.NET as well as C# and other .NET languages.
Reed Copsey
+2  A: 

What happens with the code that you show depends on what type objOriginal is:

  • If it is a reference type, objClone will reference the same instance as objOriginal
  • If it is a value type, objClone will be a new instance, with the same content as objOriginal

Note though, if it is a value type having any members being reference types, those members will reference the same instances as the original object (this is known as a shallow copy).

Examples:

Public Class Test
    Public Number As Integer
End Class

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

In this case, objClone and objOriginal will both reference the same instance of Test.

Public Structure Test
    Public Number As Integer
End Class

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

In this case, objClone and objOriginal will be different instances of Test, each with their own Integer instance in the Number field.

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

In this case, objClone and objOriginal will be two different instances of k, but both will reference the same instance of SomeValue through their Value member.

Fredrik Mörk
Wow! That's a messy problem to debug.
Achilles