ナナエフ

同人ゲームサークル『7-FIELD』制作ブログ  -ゲーム制作やイベント参加などの活動情報 + 雑記-

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

[C#]自作クラスによるメンバ内容のコピーについて

tetsuwoです。 【 twitter

自作したクラスのインスタンスを生成し、同じ型への内容コピーについて疑問が残ったのでメモ。

いつかしっかり理解しないと・・・。

  参考: 【 C#でオブジェクトのコピーはどうするのでしょう 】 - Yahoo! 知恵袋
 
 
格納値のコピー

冒頭のリンク先に書かれている内容は、既知のものでした。


変数の型により値型・参照型が決められており、コピーする時 ”コピー先 = コピー元” と単純に書いてしまうと

アドレスが渡され、コピー先と元で内容が同期してしまう・・・という話です。


C# にはその状況を防ぐため、デフォルトでcloneメソッドが用意されているので利用していました。

しかし、それでもアドレスが渡されるパターンがあるようです。



簡易的な表現ですが、具体的には下記のような感じです。

─<自作クラスサンプル>────────────────────────────

public class 自作クラス1
{
public int data;
public int[] array;
public 自作クラス2[] cls2;
}

public class 自作クラス2
{
public int data;
public int[] array;
}

─<コピー方法>────────────────────────────

// 自作クラス1の複写
自作クラス1 class1 = new 自作クラス1();

int copy_cls1_data = class1.data; ← 値型なので問題なし
int[] copy_cls1_array1 = class1.array; ← 参照型なのでアドレスが渡され、同期してしまう
int[] copy_cls1_array2 = class1.array.Clone(); ← Cloneメソッドにより、値型としてコピーしてくれる

自作クラス2 class2 = new 自作クラス2();
// class2 = class1.cls2 ← 参照型なので、これだとアドレスが渡されてしまう…
class2.data = class1.cls2.data; ← 変数を1つずつ
class2.data = class1.cls2.array.Clone(); ← 値型として代入してみる


────────────────────────────────────────


しかしながら、自作クラス2の複写は Clone を用いても参照型とされてしまいます。

この原因が全くの不明。



とりあえずは、クラス内に内容をコピーする自作メソッドを用意して解決しましたが

しっかり特定しないと似たような事が発生しそうなので、早めに調べないとと思います。


─<とりあえずの解決法>────────────────────────────

public class 自作クラス1
{
public int data;
public int[] array;
public 自作クラス2[] cls2;
}

public class 自作クラス2
{
public int data;
public int[] array;

↓インスタンスのクローンを作成。インスタンス全体の clone なら問題なく値型で作成される。
public 自作クラス2 Clone() { return (自作クラス2) this.MemberwiseClone(); };
}

─<コピー方法>────────────────────────────

自作クラス1 class1 = new 自作クラス1();
自作クラス2 class2 = new 自作クラス2();

class2 = class1.cls2.Clone();

────────────────────────────────────────


何なんだろうか・・・。

宣伝

2031年 秋、北守新都市。生活にAR技術が根付いたこの街で

"傷"を抱えた7人がそれぞれに見出す"真実"とは。


ad4_introduction01.png

当サークル第2弾作品「薄鈍アドベント」DL販売中です。

体験版も公開しておりますので、目に止まりましたらお試しあれ。
 
スポンサーサイト
  1. 2013/09/03(火) 22:00:00|
  2. 制作
  3. | トラックバック:0

トラックバック

トラックバック URL
http://7fblog.blog.fc2.com/tb.php/264-da0633b0
この記事にトラックバックする(FC2ブログユーザー)

カウンター

プロフィール

akinasi, tetsuwo

Author:akinasi, tetsuwo
FC2ブログへようこそ!

検索フォーム

カレンダー

09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

告知 (63)
制作 (88)
ソフト紹介 (19)
素材紹介 (10)
言外 (7)
雑記 (361)
ナナエ (29)

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。