• ベストアンサー

構造体の値受け渡しについて

初歩的な質問で申し訳ありません。 現在、下記の現象に悩んでいます。 私の勉強不足が原因で大変恐縮なのですが、知見のある方はぜひアドバイスを宜しくお願い致します。 開発環境:VisualStudio2005.NET C# 現在下記のような構成でプログラムを開発しています。  ・構造体を定義しているクラス  ・メイン画面  ・サブ画面 構造体定義を共有化し、 メイン画面からプロパティ渡しでサブ画面にデータを渡しサブ画面のみで構造体の中身を編集したいのですが、※1の代入のタイミングで、メイン画面側の構造体も値が変わってしまいます。 いろいろ調べてみたのですが構造体は値型の受け渡しと書いている記事しか見つかりませんでした。 上記機能を実現するための解決法をご存知の方がいらっしゃいましたらアドバイス宜しくお願い致します。 //============================================== //構造体定義クラス //============================================== public class StructureCommonClass { public struct TestType { public int Data; } } //============================================== //メイン画面 //============================================== public partial class Form1 : Form { private StructureCommonClass.TestType[] _Test = new StructureCommonClass.TestType[3]; //コンストラクタ public Form1() { InitializeComponent(); _Test[0].Data = 10; _Test[1].Data = 20; _Test[2].Data = 30; } //取得用プロパティ public StructureCommonClass.TestType[] GetTestData { get { return _Test; } } //ボタンイベント private void button_F1_Click(object sender, EventArgs e) { Form2 _frm = new Form2(this); _frm.ShowDialog(); _frm.Dispose(); } } //============================================== //サブクラス //============================================== public partial class Form2 : Form { private Form1 _mainForm; private StructureCommonClass.TestType[] _Test; public Form2(Form1 _frm) { InitializeComponent(); _mainForm = _frm; } //フォームロード private void Form2_Load(object sender, EventArgs e) { _Test = _mainForm.GetTestData; _Test[0].Data = 50; //---- ※1 ---- } }

質問者が選んだベストアンサー

  • ベストアンサー
  • c4ycaant
  • ベストアンサー率30% (7/23)
回答No.2

_Test = _mainForm.GetTestData; _Test[0].Data = 50; では、_mainFormの_Testをそのまま取得して、、_mainFormの_Testの値を変更していることになります。 ということで、コピーを作る必要があると思います。 メインのデータを絶対的なものとするなら、メイン画面の方でサブに触らせたくないものは返さないという方法がいいのかなぁと思います。 例としてメイン側でGetTestDataで返すものを_Testのクローンにするのはどうでしょう。 こんな感じで↓ public StructureCommonClass.TestType[] GetTestData { get { return (StructureCommonClass.TestType[])_Test.clone(); } } 私もC#はまだ未熟なので参考までにしてください。

NaN_NaN
質問者

お礼

c4ycaantさんありがとうございます。 説明だけでなく、丁寧にソースまで書いていただき大変参考になりました。おかげ様で解決することができました。 ありがとうございました。

その他の回答 (1)

回答No.1

# ここは C# の質問を許すのか? カテゴリが違うぞ!? _Test = _mainForm.GetTestData; // [ココ] _Test[0].Data = 50; ↑[ココ]で配列のコピーを作ればいい。 どうやって作るかは教本に書いてあることでしょう。

NaN_NaN
質問者

お礼

カテゴリ違い申し訳ありません。 _mainForm.GetTestDataのCloneを作成することで解決できました。 初歩的な質問なのに回答していただきありがとうございました。

関連するQ&A