1

次のコードを試しています:

public class cloneTest : ICloneable {

    public string strValue { get; set; }

    public object Clone( ) {
      cloneTest n = new cloneTest( );
      n.strValue = this.strValue;
      return n;     
    }
}

cloneTest obj1 = new cloneTest( ) { strValue = "one" };
cloneTest obj2 = new cloneTest( ) { strValue = "two" };
cloneTest obj3 = new cloneTest( ) { strValue = "three" };

cloneTest[ ] strValueArray = new cloneTest[  ] {obj1, obj2, obj3};

cloneTest[ ] strValueArrayClone = ( cloneTest[ ] )strValueArray.Clone( );
strValueArrayClone[ 2 ].strValue = "four";

コードで指定されているように strValuArrayClone オブジェクトを変更すると、クローンを作成しているにもかかわらず、この変更が strValueArray オブジェクトにも反映されます。ただし、以下のコードを試すと、すべてがスムーズに機能します。その背後にあるロジックを理解したい。

cloneTest obj1 = new cloneTest( ) { strValue = "one" };
cloneTest obj2 = new cloneTest( ) { strValue = "two" };
cloneTest obj3 = new cloneTest( ) { strValue = "three" };

cloneTest[ ] strValueArray = new cloneTest[  ] {obj1, obj2, obj3};

cloneTest[ ] strValueArrayClone = ( cloneTest[ ] )strValueArray.Clone( );
cloneTest obj2clone = ( cloneTest )obj2.Clone( );
obj2clone.strValue = "six";
strValueArrayClone[ 2 ] = obj2clone;
4

1 に答える 1

2

arrayのクローンを作成していますが、内容は同じです。配列Clone()メソッドは浅いクローンです。内容は参照であるため、両方の配列のスロットは同じ実際のオブジェクト インスタンスを参照します。最初のコード サンプルでは、​​3 つcloneTestのインスタンスへの参照を使用して作成した配列の数に関係なく、3 つのインスタンスしかありません。これら 3 つのオブジェクトのいずれかのプロパティを変更すると、そのオブジェクトへの参照があるすべての場所に表示されます。つまり、すべての配列を介して表示されます。

オプション:

  • ディープ クローンを作成します(つまり、アレイのクローンを作成する時点で、内部アイテムもクローンします)。
  • プロパティを変更する時点でオブジェクトを複製します (これが 2 番目のコード サンプルの動作です)。
    • これの特殊なケースは、元の型をimmutableにして、そのような発生を排除することです
于 2014-05-28T08:51:46.933 に答える