1

これらの関数がどのように呼び出されるかを知りたいです。ヒープがいっぱいの場合と同様に、GCが呼び出されます。オブジェクトにマークを付け、そのファイナライズ操作を呼び出します。これで、スイープステージが作成されました。このステージでは、そのオブジェクトへの参照が削除され、オブジェクトにアクセスできなくなります。 。その時何をしているのか...

4

4 に答える 4

2

.NETガベージコレクタがどのように機能するかを説明するドキュメントはたくさんあります。まず、いくつかを紹介します。

http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

http://msdn.microsoft.com/en-us/library/ms973837.aspx

http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/

于 2010-02-14T17:34:05.847 に答える
2

C#/。NETには「デストラクタ」はありませんが、この用語は過去に「ファイナライザ」と同じ意味で使用されていたようです。

ほとんどの場合、ファイナライザーを実装するべきではありません。これらを使用する必要がある主な例は、クラスが管理されていないリソースを保持している場合です。この場合、パターンを実装する必要があります(技術的には、「デストラクタ」IDisposableと呼ぶことができますが、実際にはヒープ上のメモリを解放しませ。 、これはメモリ管理について説明する際の重要な違いです)。Dispose

メモリ管理の観点からGCを二度と推測しないでください。使用している管理されていないリソース(ファイルハンドルなど)を必ず解放してください。そして、デストラクタという用語を使用している人を見かけたら、おそらくファイナライザーと言うつもりでした。

于 2010-02-14T15:42:16.907 に答える
2

このソースをお勧めします。 C# コンパイラ チームの Eric Lippertは、この正確なテーマについて最近投稿しました:デストラクタとファイナライザの違いは何ですか?

受け入れられている定義からすると、実際には C# では逆になっています。彼の投稿を読んでください。これ以上説明することはできません。

于 2010-02-14T15:44:11.627 に答える
1

.Net メモリ管理に関する非常に優れたビデオは、.Net メモリ管理にあります。ファイナライザーと、それがいつ呼び出されるか、どのように呼び出されるかなどについての疑問を解消するのに役立ちます。

于 2010-02-14T17:48:15.887 に答える