70446


<https://docs.microsoft.com/ja-
jp/dotnet/api/system.object.memberwiseclone?view=netcore-3.1>  
上記URLにてObject.MemberwiseCloneメソッドについて記述がありますが  
ここで示されている例ではstring型のメンバフィールドをstring.Copyを使用してコピーしています。

[code]

    public class Person
    {
        public int Age;
        public string Name;
        public IdInfo IdInfo;
    
        public Person DeepCopy()
        {
           Person other = (Person) this.MemberwiseClone();
           other.IdInfo = new IdInfo(IdInfo.IdNumber);
           other.Name = String.Copy(Name);
           return other;
        }
    }
    
[/code]

しかし、実際にはMemberwiseClone()を用いて生成したクローンの  
stringフィールドを変更しても元のインスタンスには影響を与えません。  
また、この例にあるstring.CopyはObsoleteとなっています。

仮に、string型フィールドのみ、または値型とstring型フィールドのみの  
クラスであればMemberwiseClone()を用いてクローンを生成するだけで  
ディープコピーと同じ状態を得られると考えて問題ないでしょうか。


CC BY-SA 4.0
2020-09-16T05:00:26.703
70433
2020-09-16T09:36:59.937
38100
question
c#
Object.MemberwiseCloneメソッドでクローン生成時のstring型メンバはコピーが必要か


[`String.Copy`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.string.copy?view=netcore-3.1)に

> 特に、.NET Core 3.0 では文字列インターンが変更されているため、 Copy
> メソッドは新しい文字列を作成せず、単に既存のインターン文字列への参照を返す場合があります。

とあるように、ディープコピーを実現できない可能性があります。

オブジェクトには様々なコピー要求があり`Object.MemberwiseClone`ではカバーしきれないため利用はあまり推奨されていません。ご自身の望むコピー処理を直接記述されることをお勧めします。例えば、[`String`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.string?view=netcore-3.1#Immutability)は不変なためディープコピーする意義がないかもしれません。


CC BY-SA 4.0
2020-09-16T08:13:38.630
70442
2020-09-16T08:13:38.630
4236
70433
answer


> Object.MemberwiseCloneメソッドでクローン生成時のstring型メンバはコピーが必要か

不要です。string型のインスタンスは内容が変化することがない(immutable,不変である)ため、内容をコピーして新しいインスタンスを作る必要はありません。

> 仮に、string型フィールドのみ、または値型とstring型フィールドのみの  
>  クラスであればMemberwiseClone()を用いてクローンを生成するだけで  
>  ディープコピーと同じ状態を得られると考えて問題ないでしょうか。

はい、厳密にはディープコピーではありませんが、実用上その認識で問題ありません。


CC BY-SA 4.0
2020-09-16T09:36:59.937
70446
2020-09-16T09:36:59.937
14817
70433
answer