エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Object.MemberwiseClone メソッド

2013/12/12

現在の Object の簡易コピーを作成します。

Namespace:  System
アセンブリ:  mscorlib (mscorlib.dll 内)

'宣言
Protected Function MemberwiseClone As Object

戻り値

型: System.Object
現在の Object の簡易コピー。

MemberwiseClone メソッドは、新しいオブジェクトを作成し、現在のオブジェクトの非静的フィールドをその新しいオブジェクトにコピーすることによって、簡易コピーを作成します。フィールドが値型の場合、そのフィールドはビット単位でコピーされます。フィールドが参照型の場合、参照はコピーされますが、参照先オブジェクトはコピーされないため、元のオブジェクトとその複製は同じオブジェクトを参照します。

たとえば、オブジェクト A と B を参照する X というオブジェクトを考えてみます。オブジェクト B はオブジェクト C を参照しています。X の簡易コピーでは、オブジェクト A と B を参照する新しいオブジェクト X2 が作成されます。これに対して、X の詳細コピーでは、A と B のコピーである新しいオブジェクト A2 と B2 を参照する新しいオブジェクト X2 が作成されます。B2 は、C のコピーである新しいオブジェクト C2 を参照します。この例は、簡易コピー操作と詳細コピー操作の違いを示しています。

MemberwiseClone メソッドによって実行される簡易コピー操作がニーズを満たさない場合、詳細コピー操作を実装する方法は多数あります。次に例を示します。

  • コピーするオブジェクトのクラス コンストラクターを呼び出して、最初のオブジェクトから取得したプロパティ値で 2 番目のオブジェクトを作成します。これは、オブジェクトの値が、クラス コンストラクターによって完全に定義されていることを前提としています。

  • MemberwiseClone メソッドを呼び出して、オブジェクトの簡易コピーを作成し、値が元のオブジェクトと同じ新しいオブジェクトを値が参照型のプロパティまたはフィールドに割り当てます。例の中の DeepCopy メソッドは、このアプローチを示しています。

  • 詳細コピーされるオブジェクトをシリアル化した後、シリアル化されたデータを別のオブジェクト変数に復元します。

  • 再帰でリフレクションを使用して、詳細コピー操作を実行します。

MemberwiseClone メソッドの例を次に示します。この例では、MemberwiseClone メソッドを呼び出して Person オブジェクトのシャロー コピー操作を実行する ShallowCopy メソッドを定義します。また、Person オブジェクトの詳細コピー操作を実行する DeepCopy メソッドを定義します。


Public Class IdInfo
   Public IdNumber As Integer

   Public Sub New(ByVal IdNumber As Integer)
      Me.IdNumber = IdNumber
   End Sub
End Class

Public Class Person
   Public Age As Integer
   Public Name As String
   Public IdInfo As IdInfo

   Public Function ShallowCopy() As Person
      Return DirectCast(Me.MemberwiseClone(), Person)
   End Function

   Public Function DeepCopy() As Person
      Dim other As Person = DirectCast(Me.MemberwiseClone(), Person)
      other.IdInfo = New IdInfo(Me.IdInfo.IdNumber)
      Return other
   End Function
End Class

Module Example
   Public Sub Demo(ByVal outputBlock As System.Windows.Controls.TextBlock)
      ' Create an instance of Person and assign values to its fields.
      Dim p1 As New Person()
      p1.Age = 42
      p1.Name = "Sam"
      p1.IdInfo = New IdInfo(6565)

      ' Perform a shallow copy of p1 and assign it to p2.
      Dim p2 As Person = DirectCast(p1.ShallowCopy(), Person)

      ' Display values of p1, p2
      outputBlock.Text &= "Original values of p1 and p2:" & vbCrLf
      outputBlock.Text &= "   p1 instance values: " & vbCrLf
      DisplayValues(outputBlock, p1)
      outputBlock.Text &= "   p2 instance values:" & vbCrLf
      DisplayValues(outputBlock, p2)
      outputBlock.Text &= vbCrLf

      ' Change the value of p1 properties and display the values of p1 and p2.
      p1.Age = 32
      p1.Name = "Frank"
      p1.IdInfo.IdNumber = 7878
      outputBlock.Text &= "Values of p1 and p2 after changes to p1:" & vbCrLf
      outputBlock.Text &= "   p1 instance values: " & vbCrLf
      DisplayValues(outputBlock, p1)
      outputBlock.Text &= "   p2 instance values:" & vbCrLf
      DisplayValues(outputBlock, p2)
      outputBlock.Text &= vbCrLf

      ' Make a deep copy of p1 and assign it to p3.
      Dim p3 As Person = p1.DeepCopy()
      ' Change the members of the p1 class to new values to show the deep copy.
      p1.Name = "George"
      p1.Age = 39
      p1.IdInfo.IdNumber = 8641
      outputBlock.Text &= "Values of p1 and p3 after changes to p1:" & vbCrLf
      outputBlock.Text &= "   p1 instance values: " & vbCrLf
      DisplayValues(outputBlock, p1)
      outputBlock.Text &= "   p3 instance values:" & vbCrLf
      DisplayValues(outputBlock, p3)
   End Sub

   Public Sub DisplayValues(ByVal outputBlock As System.Windows.Controls.TextBlock, ByVal p As Person)
      outputBlock.Text += String.Format("      Name: {0:s}, Age: {1:d}", p.Name, p.Age) & vbCrLf
      outputBlock.Text += String.Format("      Value: {0:d}", p.IdInfo.IdNumber) & vbCrLf
   End Sub
End Module
' The example displays the following output:
'       Original values of m1 and m2:
'          m1 instance values:
'             Name: Sam, Age: 42
'             Value: 6565
'          m2 instance values:
'             Name: Sam, Age: 42
'             Value: 6565
'       
'       Values of m1 and m2 after changes to m1:
'          m1 instance values:
'             Name: Frank, Age: 32
'             Value: 7878
'          m2 instance values:
'             Name: Sam, Age: 42
'             Value: 7878
'       
'       Values of m1 and m3 after changes to m1:
'          m1 instance values:
'             Name: George, Age: 39
'             Value: 8641
'          m3 instance values:
'             Name: Frank, Age: 32
'             Value: 7878


この例では、Person.IdInfo プロパティは、IdInfo オブジェクトを返します。出力を見るとわかるように、MemberwiseClone メソッドを呼び出すことによって Person オブジェクトが複製された場合、複製された Person オブジェクトは、同じ Person.IdInfo オブジェクト参照を共有している点を除けば、元のオブジェクトの独立したコピーです。その結果、複製の Person.IdInfo プロパティを変更すると、元のオブジェクトの Person.IdInfo プロパティが変更されます。一方、詳細コピー操作が実行された場合、クローンされた Person オブジェクト (Person.IdInfo プロパティを含む) は元のオブジェクトに影響を与えることなく変更されます。

Windows Phone OS

サポート: 8.0, 7.1, 7.0

表示:
© 2014 Microsoft