最近、オブジェクト指向プログラミングに焦点を当てた入門ユニットを用意していましたが、C#のガベージコレクタに導入されました。より長く参照される。その後、私はデストラクタに導入され、オブジェクトが削除される直前にどのように呼び出されたのですか?同じクラスとガベージコレクションのデストラクタ内でのオブジェクトのインスタンス化
もちろん、私は思っていましたが、私はそれについて講師に尋ねることを思い出しませんでした。同じクラスのデストラクタ内でクラスのインスタンスを作成するとどうなりますか?
C#の例
class Person{
~Person(){
Person p = new Person();
Console.WriteLine("Person destroyed");
}
}
class Program{
static void Main(string[] args){
Person p = new Person();
}
}
私は、ビューのより理論的な観点からこれにアプローチしたいと思いますので、私はおそらく、とにかく理解できないであろうから、私はそれを試して(この段階では)消極的です私はいくつかの理論を持っています。また、私は今、私の通常のコンピュータではないよ;)
- 人〜人()新しい人が作成されるたびとして、そのデストラクタを呼び出して、新しいを作成するために起こっている、再帰的に起こっていますPerson ad infinitum、または何らかのメモリ関連例外が発生するまで。その後、メインは決して終了しません。
- コンパイラは文句を言うでしょう(すべてのシナリオにこのオプションを追加するのは良い考えです)。
- どういうわけか、ある種の「デストラクタースキップ」が発生します。すなわち、オブジェクトの破壊は順番に呼び出されないので、どちらもコンストラクタではありません。
類似の質問があります。ガベージコレクタの役割が、もはや参照/不要になっているオブジェクトを削除することである場合、上記のような状況はガベージコレクタのない環境でどのように処理されますか?
私はこの単純なプログラムの実行がどのように停止するのか知りたいのですか?明らかにファイナライザを連鎖してコンソールに出力し始めます。どのようにランタイムは実際にこのプロセスを終了しますか(通常の終了は私が知る限りファイナライザを実行します)。 – InBetween
@InBetween - 異常終了の場合は問題ありません。協調シャットダウンでは、.Netランタイムがアプリケーションがボールを再生していないと判断した場合、最終的にファイナライザの処理を停止し、すべてをリリースします。ファイナライザは、他のものよりもあなたのプログラムにとってとても礼儀正しいものです。より現代的なWindowsオペレーティングシステムでは、プロセスが終了するとリソースも解放されます。 –