※ ChatGPTを利用し、要約された質問です(原文:C#デストラクタが走る理由がわからない(初心者))
C#デストラクタが走る理由がわからない
このQ&Aのポイント
C#の初心者ですが、MainWindowクラスで定義したクラス変数にインスタンスを生成しています。しかし、インスタンスを参照しようとするとNullとなってしまいます。デストラクタが走っているようですが、なぜでしょうか?
MainWindowクラスのメンバにはクラス変数を追加し、インスタンスを生成しています。アプリが終了するまでインスタンスが参照されているはずですが、デストラクタが走ってしまいます。この理由を教えてください。
また、Button_Clickイベントでインスタンスを参照する方法も教えていただけますか?
WPF C# アプリを初めて組んでいます。
MainWindowクラスで、publicなクラス変数配列(myclass)を定義し、
MainWindowのコンストラクタ(もしくはLoadedイベント)で、上記クラス変数にインスタンスを生成しています。
そのインスタンスを、MainWindows内のコントロールイベント(Button_Click)で参照しようとするとNullとなっておりました。
MainWindowのコンストラクタ(もしくはLoadedイベント)完了後に、デストラクトが走っているようです。
どこからも参照されていなければGCが走りデストラクタされるのはわかるのですが、
この場合、MainWindowクラスのメンバにクラス変数を追加し、そこにインスタンスを生成しています。よって、MainWindow(つまりアプリが)が終了するまでインスタンスが参照されているため、
デストラクタが走らないのではないかと考えておりました。
ですが、上記の通り、MainWindowのコンストラクタ(もしくはLoadedイベント)後には、MyClassデストラクタが走ってしまいます。この辺を教えていただけないでしょうか。
また、下記のように、Clickでインスタンスを参照するにはどうすればよいでしょうか。
public partial class MainWindow : Window
{
MYClass []myclass;
public MainWindow()
{
InitializeComponent();
//ファイル読み込み(記載省略)
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;
}
}
}
お礼
大変助かりました。ありがとうございます。
補足
ご回答いただきましてありがとうございます。 >変数だけ用意して、その中身が用意されていないように見えるのですが。 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; } } }