2017-07-21 29 views
0

私はそのコンストラクタを使用してオブジェクトのコピーを作成しようとしていますが、コピーの何かを変更すると、元のオブジェクトも変更されます。あなたが私を助けることができる場合、私は感謝するよ、これは私のコードです:コンストラクタを使用してオブジェクトのコピーをC#で作成するにはどうすればよいですか?

public class XMLStructure 
{ 
public XMLStructure(XMLStructure xmlCopy) 
    { 
    this.Action = xmlCopy.Action; 
    this.Name = xmlCopy.Name; 
    } 
    public String Name { get; set; } 
    public ActionXML Action { get; set; } 
} 
+0

実際には文字列は実際にコピーされますが、 'ActionXML'は依然として元の文字を参照します –

+0

文字列は不変です。あなたは効果的にそのような価値をコピーしている "一種の"ものです。しかし、ActionXmlは参照型です。ポインタを値にコピーするだけです。あなたはあなたのオブジェクトの 'ディープコピー'をする必要があります。 – fharreau

+0

@OfirWinegarten:文字列はコピーされません。文字列はまったく同じ参照型です。しかし、文字列は不変であり、 "変更されたとき"の問題を作ります。moot - "文字列を変更する"とは、新しい文字列を作成して割り当てることです。一方、 'ActionXML'を変更することはおそらく、そのプロパティを通して直接行われます。 –

答えて

1

あなたが観察した問題を回避するには、オブジェクトを「深くクローンする」必要があります。 .Netでこれを行うために受け入れられる方法は、長年にわたって進化してきました。今日最も簡単なオプションは、オブジェクトをJSON文字列にシリアル化し、そのJSON文字列から新しいオブジェクトを水和することです。

var json = JsonConvert.SerializeObject(xmlSourceObject); 
var clonedXmlObject = JsonConvert.DeserializeObject<XMLStructure>(json); 

より伝統的な.Netソリューションは、ICloneableインターフェイスを実装することです。

7

ActionXMLが参照型である、あなたもActionXMLのコピーを作成する必要があります。

Hereは、参照型と値型を説明するWebページへのリンクです。

1

ActionXMLとそのクラス内の他の参照型変数に対して同じことを(コンストラクタの追加、コピー可能)する必要があります。

関連する問題