インスタンスの中身をコピーするには、大きく分けて 2 通りの方法があります。
ひとつが、インスタンス内のメンバを手動でコピーする方法です。
この方法は、Clone、Copy のような名前のメソッドを定義し、
その中で新規のインスタンスを生成し、既存のインスタンスからコピーすれば良いのです。
(C# だと読めない (読まない) 方が多いらしいので、VB で書いてみました)
VB.NET
Option Strict On
' テスト用のデータクラス
Public Class WankumaMember
' 面倒なのでフィールド メンバにしちゃってます
Public MemberCode As Integer
Public MemberName As String
Public Age As Integer
' 同じクラスのインスタンスを返すクローン コピーメソッド
Public Function CloneCopy() As WankumaMember
' 同クラスの新しいインスタンスを生成する
Dim hClone As New WankumaMember()
' 新しい方のインスタンスに、現インスタンスのメンバの内容をひとつひとつ丁寧に渡す
hClone.MemberCode = Me.MemberCode
hClone.MemberName = Me.MemberName
hClone.Age = Me.Age
' コピーされた方のインスタンスを返す
Return hClone
End Function
End Class
この方法の欠点はメンバに変化があったら、当然変更しなくてはいけないという点です。
逆に予期せぬクローン コピーは発生しないというのはメリットにもなるでしょう。
もうひとつが、System.Object.MemberwiseClone メソッドを使用する方法です。
こちらは、上記のように、ひとつひとつメンバをコピーする必要はありません。
通常、MemberwiseClone メソッドは、System.ICloneable インターフェイスを実装して使われます。
実装することになる System.ICloneable.Clone メソッドの戻り値は System.Object 型です。
戻り値が System.Object 型ということは、利用する側で型変換しなくてはなりません。
これでは面倒ですので、System.ICloneable.Clone メソッドは Private のアクセス修飾子とし、
これをラップして、戻り値を同じクラスの型にする ラッパーメソッドを書きます。
VB.NET
Option Strict On
' テスト用のデータクラス (System.ICloneable インターフェイスを実装)
Public Class WankumaMember : Implements System.ICloneable
' 面倒なのでフィールド メンバにしちゃってます
Public MemberCode As Integer
Public MemberName As String
Public Age As Integer
' System.ICloneable.Clone メソッド (非公開メンバとする)
Private Function Clone() As Object Implements System.ICloneable.Clone
Return Me.MemberwiseClone()
End Function
' 同じクラスのインスタンスを返すクローン コピーメソッド (上のメソッドを型変換して返す)
Public Function CloneCopy() As WankumaMember
Return DirectCast(Me.Clone(), WankumaMember)
End Function
End Class
System.ICloneable.Clone メソッドを MemberwiseClone メソッドで実装する場合、
注意しなくてはならないことがあります。
今回の例では、値型のメンバしか含まれないので問題になりませんが、
参照型のメンバを含む場合は、参照先のインスタンスそのものがコピーされるのではなく、
参照先を示すアドレス、言わばポインタ (参照) がコピーされるだけです。
そのため、複製元、複製先のどちらかで参照型のメンバの実体に変更を加えれば、
もう一方からも変更されることになります。(というよりは、同じものを見ているから当たり前ですね)
これについての詳細は、次回の シャローコピー と ディープコピー で、ご紹介します。
それにしても、シャローコピー、簡易コピー、簡易複製、Shallow Copy、浅いコピー、
ディープコピー、Deep Copy、深いコピー、深い複製... 色んな名称がありすぎです。