C#のオブジェクトでMemberwiseClone()を試す。

C# コンピュータ
C#
自前で作成したクラスのオブジェクトをClone()しようと思ったら出来ませんでした。
どうやらClone()メソッドは自前で用意する必要があるようです。
調べたところ、オブジェクトをコピー(Clone)する場合MemberwiseClone()が便利そうなので動作確認をしてみます。

ソースコード

using System;
using System.Reflection.Metadata.Ecma335;
using System.Security.Cryptography.X509Certificates;

namespace OpenCVFilters3.Console;

class Program1
{
    class DeepCopyTest
    {
        public string Name { get; set; } = "DeepCopyTest Class";
        public Guid Id { get; set; }
        public int Ksize { get; set; } = 3;
        public DeepCopyTest()
        {
            Id = Guid.NewGuid();
        }
        public DeepCopyTest DeepCopy()
        {
            var obj = (DeepCopyTest)this.MemberwiseClone();

            obj.Id = Guid.NewGuid();
            obj.Name = new string(Name);

            return obj;
        } 
    }
    static void Main()
    {
        var obj = new DeepCopyTest();
        System.Console.WriteLine($"original  Id:{obj.Id} Ksize:{obj.Ksize} Name:{obj.Name} ");

        var clone = obj.DeepCopy();
        obj.Name = "Foo";
        obj.Ksize = 9;
        System.Console.WriteLine($"original2 Id:{obj.Id} Ksize:{obj.Ksize} Name:{obj.Name} ");
        System.Console.WriteLine($"   clone  Id:{clone.Id} Ksize:{clone.Ksize} Name:{clone.Name} ");
    }
}

実行結果

original  Id:36bb2a70-6133-4e04-9d0b-a0ae8e8c9824 Ksize:3 Name:DeepCopyTest Class 
original2 Id:36bb2a70-6133-4e04-9d0b-a0ae8e8c9824 Ksize:9 Name:Foo 
   clone  Id:542bf739-d15d-487b-aa75-bfa460039c96 Ksize:3 Name:DeepCopyTest Class 
int型のKsizeはMemberwiseClone()がコピーしてくれます。string型のNameはNameプロパティをコンストラクタの引数に新たなオブジェクトを生成しています。
Idは重複すると具合が悪いプロパティなので、コピーせずに別の値のオブジェクトを生成しています。
オリジナルのオブジェクトのプロパティの値を変更してもコピー先のオブジェクトに影響がないことが確認出来ました。
以上

コメント