- - PR -
データのコピーについて
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-06-24 17:13
C#でWindowsアプリを開発しています。
1) Model tmpModel = (Model)_Model; 2) tmpModel = CCommon.AZBuil(tmpModel); 1) でデータをtmpModel にコピーし、2)のメソッドでtmpModelの値を 書き換えています。 しかし、書き換えた内容がコピー前の_Modelにまで反映されてしまいます。 なぜでしょうか? 反映されないようにするにはどう修正したらよいでしょうか? ご教授お願いします。 | ||||||||
|
投稿日時: 2004-06-24 17:29
Model型がクラスだとすると、こんなのを「データをコピー」などと呼んではいけません。_Modelのインスタンス「の参照をコピー」したにすぎません。 あるいは構造体だとしても、メンバの型などを考慮する必要があります。 考えられるキーワードは Clone とか、ディープコピー(deep copy) とか。 コピーというのは、結構奥が深いですよ。 [ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-06-24 17:35 ] | ||||||||
|
投稿日時: 2004-06-24 17:49
値型と参照型について理解されるとよろしいかと思います。
参考: http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_006/cs2_006_01.html ---------- ん・・・・? Modelが何型か、CCommon.AZBuil()が何をしているのか情報が足りないので何ともいえませんが、わざわざCCommon.AZBuil()の返り値をtmpModelに代入していることから、CCommon.AZBuil()内で引数の状態を変更していることは考えにくいですね。 ・・・だとするとおかしいかな。 「書き換え」というのはどこで行っているどの処理のことを言っていますか? [ メッセージ編集済み 編集者: 一郎 編集日時 2004-06-24 17:54 ] | ||||||||
|
投稿日時: 2004-06-25 09:38
私の推測では、こんな雰囲気なのではないかと……あくまでも推測ですが。
(たぶん、StringBuilder.Appendメソッドみたいなことをしているのかも。) ……でも、damepgさん。 Modelの型が不明なのもそうですが、できればこういうことは人に推測させないでくださいね。 ということで、まとめます。
ちなみにdeep copyは、「誰かが良きにはからってくれる」とは限りません。 「deep copyされるとメモリ効率が非常に悪くなり、非常に低速になる」側面もあるからです。 自分でdeep copyしなければいけない場合も考えてください。 [ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-06-25 09:48 ] |
1