C#でオブジェクトをコピーする方法:MemberwiseCloneの使い方

C#

参照型変数(主にクラスのオブジェクト)をコピーする場合、単純に「=」で代入するだけでは不十分な場合があります。
参照型変数の中身は参照先(オブジェクトのメモリ領域を示すポインタ)です。
「=」で代入するだけでは、参照先だけがコピーされて、参照しているものは同じという状態になるので、コピー先の変更がコピー元に影響してしまいますし、その逆にコピー元の変更がコピー先に影響してしまいます。

これを避けたい場合は、MemberwiseCloneメソッドを用いて中身を丸ごとコピー(新たにメモリ領域を確保し書き込み、ディープコピー)する必要があります。
MemberwiseCloneメソッドはobject型で定義されており、C#ではすべての型はobject型から派生しているので、特別な記述を行わなくともMemberwiseCloneメソッドを使用できます。ただし、戻り値はobject型なので、キャスト等の考慮は必要です。
(javaの場合はこちらの記事のようにインターフェースの実装が必要だったり例外処理が必要だったりと色々面倒です。後発言語であるC#では言語仕様上ディープコピーを始めから考慮している印象を受けます。)

以下、サンプルコードです。
参照先のみコピーした場合とMemberwiseCloneメソッドで中身をコピーした場合を比較しています。
参照先のみコピーした場合は、コピー後にコピー先を変更した際にコピー元が影響を受けていますが、MemberwiseCloneメソッドで中身をコピーした場合は影響を受けていません。

【サンプルコード】

・CloneableItem.cs

・ItemCloneMain.cs

【実行結果】


いかがでしたでしょうか?

C#は後発言語であるため、記述を簡略化できる場面が多いです。
今回紹介したディープコピーの例もそうですし、getter・setterの記法もC#だと簡略化できます(今回のサンプルコード中にも出てきます)。
javaを触った後にC#を触ると、こうした細かい所で便利さを感じます。

これからも、C#に関する記事を投稿していきたいと思います!

コメント

タイトルとURLをコピーしました