• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C#デストラクタが走る理由がわからない(初心者))

C#デストラクタが走る理由がわからない

このQ&Aのポイント
  • C#の初心者ですが、MainWindowクラスで定義したクラス変数にインスタンスを生成しています。しかし、インスタンスを参照しようとするとNullとなってしまいます。デストラクタが走っているようですが、なぜでしょうか?
  • MainWindowクラスのメンバにはクラス変数を追加し、インスタンスを生成しています。アプリが終了するまでインスタンスが参照されているはずですが、デストラクタが走ってしまいます。この理由を教えてください。
  • また、Button_Clickイベントでインスタンスを参照する方法も教えていただけますか?

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

myclassの初期化はどうなっていますか? 変数だけ用意して、その中身が用意されていないように見えるのですが。 デストラクタが走っている、とはどうやって確認したのですか? Nullになっていることと、デストラクタは関係はありません。 >        for(i=0; i<ファイル読み込み数;i++) >        { >            myclass[i] = new MYClass(ファイル読み込みデータ); >        } この時点で myclassがnullなため、myclass[i]にアクセスできずに、コンストラクタが終了してたりしませんか? または、ここに来るまでにコンストラクタが終了していて、ここを通ってない、ということはありませんか?

tikyuujinkun
質問者

お礼

大変助かりました。ありがとうございます。

tikyuujinkun
質問者

補足

ご回答いただきましてありがとうございます。 >変数だけ用意して、その中身が用意されていないように見えるのですが。 myclassのコンストラクタは以下の通りです。 >デストラクタが走っている、とはどうやって確認したのですか? >Nullになっていることと、デストラクタは関係はありません。 デストラクタが走っていることは 下記クラスに ~MYClassを追加して確認しました。 デストラクタが走る前には、myclass[]には、インスタンスが存在し、それをアクセスするコードを記載しても問題なく動作しております。 public class MYClass { public string data1; public string data2; public MYCLass(string indata1,string indata2) { data1 = indata1; data2 = indata2; } } >この時点で myclassがnullなため、myclass[i]にアクセスできずに、コンストラクタが終了してたりしませんか? >または、ここに来るまでにコンストラクタが終了していて、ここを通ってない、ということはありませんか? すみません、一行配列のインスタンスを生成するコードをこちらのフォームに記載するのを忘れておりました。ですが、ご指摘のように、myclass[i]にアクセスできずに、コンストラクタが終了したり、そのせいで、for文のnewを通っていないということはありません。 ですが、この文章を書いている途中で、フォームに記載忘れた処理が、ローカル変数を新たに定義しなおしてしまっていることに気づきました(コメント記載)。それを下の処理に直しましたところ、デストラクタが走らなくなりました。大変お騒がせいたしました。 public partial class MainWindow : Window {     MYClass []myclass;     public MainWindow()     {         InitializeComponent();         //ファイル読み込み(記載省略)         //MYClass[] myclass = new MYClass[ファイル読み込み数]; ←フォームに記載忘れていた。が、間違っていることに気付いた。 myclass = new MyClass[ファイル読み込み数]; ←こちらに直したら動きました。         for(i=0; i<ファイル読み込み数;i++)         {             myclass[i] = new myclass(ファイル読み込みデータ);         }     }     private void Button_Click(object sender, RoutedEventArgs e)     {         for(int i=0;i<myclass.Length;i++)←ここに来る前にすでにMyClassのデストラクタが走っており、nullとなっている         {             data = myclass[i].data;         }     } }

関連するQ&A