- PR -

データのコピーについて

1
投稿者投稿内容
damepg
大ベテラン
会議室デビュー日: 2003/03/19
投稿数: 229
お住まい・勤務地: 東京都内
投稿日時: 2004-06-24 17:13
C#でWindowsアプリを開発しています。
1) Model tmpModel = (Model)_Model;
2) tmpModel = CCommon.AZBuil(tmpModel);

1) でデータをtmpModel にコピーし、2)のメソッドでtmpModelの値を
書き換えています。
しかし、書き換えた内容がコピー前の_Modelにまで反映されてしまいます。
なぜでしょうか?
反映されないようにするにはどう修正したらよいでしょうか?
ご教授お願いします。
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-06-24 17:29
引用:

damepgさんの書き込み (2004-06-24 17:13) より:

1) Model tmpModel = (Model)_Model;

1) でデータをtmpModel にコピーし


Model型がクラスだとすると、こんなのを「データをコピー」などと呼んではいけません。_Modelのインスタンス「の参照をコピー」したにすぎません。
あるいは構造体だとしても、メンバの型などを考慮する必要があります。

考えられるキーワードは Clone とか、ディープコピー(deep copy) とか。
コピーというのは、結構奥が深いですよ。

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-06-24 17:35 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 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 ]
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-06-25 09:38
引用:
一郎さんの書き込み (2004-06-24 17:49) より:

Modelが何型か、CCommon.AZBuil()が何をしているのか情報が足りないので何ともいえませんが、わざわざCCommon.AZBuil()の返り値をtmpModelに代入していることから、
CCommon.AZBuil()内で引数の状態を変更していることは考えにくいですね。


私の推測では、こんな雰囲気なのではないかと……あくまでも推測ですが。
コード:
public Model AZBuil(Model tmpModel){

−−−−−(何らかの処理)−−−−−
tmpModel.何たら = 何々;
return tmpModel;
}


(たぶん、StringBuilder.Appendメソッドみたいなことをしているのかも。)

……でも、damepgさん。
Modelの型が不明なのもそうですが、できればこういうことは人に推測させないでくださいね

ということで、まとめます。

  • そもそも、Model型はどういう種類(class, structなど)で定義しているのですか?
  • 値型と参照型について理解してください。
  • 深いコピー(deep copy)と浅いコピー(shallow copy)を理解してください。


ちなみにdeep copyは、「誰かが良きにはからってくれる」とは限りません。
「deep copyされるとメモリ効率が非常に悪くなり、非常に低速になる」側面もあるからです。
自分でdeep copyしなければいけない場合も考えてください。


[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-06-25 09:48 ]
1

スキルアップ/キャリアアップ(JOB@IT)