はじめに
C#のお勉強として出井秀行さんの『C# コードレシピ集』を読んでいたらオブジェクトを複製するMemberwiseCloneメソッドというものを知ったので備忘録として残しておきます。
サンプルコード
以下は値型のメンバーと参照型のメンバーを持つオブジェクトに対し、MemberwiseCloneメソッドを用いて複製を行うサンプルコードです。
オブジェクトがコピーされるのはもちろんですが、コピー後のメンバーがどうなるのかについても確認してみましょう。
Program.cs
public class Program
{
static void Main()
{
var s1 = new Sample(1, new List<string> { "Test" });
var s2 = s1.ShallowCopy();
// コピーしたオブジェクトのメンバーの値を変更する。
s2.Num = 2;
s2.StrList[0] = "Test_Changed";
Console.WriteLine($"{s1.Num},{s1.StrList[0]}");
Console.WriteLine($"{s2.Num},{s2.StrList[0]}");
}
}
public class Sample
{
public int Num { get; set; }
public List<string> StrList { get; set; }
public Sample(int num, List<string> strList)
{
Num = num;
StrList = strList;
}
// MemberwiseCloneメソッドはobject型で返却するのでSample型へキャストする必要があります。
public Sample ShallowCopy() => (Sample)MemberwiseClone();
}
出力結果
1,Test_Changed
2,Test_Changed
値型のメンバーはコピー前とコピー後で変更されていますが参照型のメンバーはどちらも変わっています。
MemberwiseCloneメソッドは参照先のアドレスをコピーしているだけなのでなるほど、参照先の値については同じなのですね。
参照型のメンバーも値型と同様の動きにしたい場合は(色々調べてみたのですが)どうやら一度MemberwiseCloneメソッドでオブジェクトのコピーを作成したのちに自前で実装していく必要がありそうでした。
その実装については以下の記事がとても分かりやすかったです!
↧