[解決済み] GC.SuppressFinalize()はいつ使うべきですか?
質問
.NETでは、どのような状況で
GC.SuppressFinalize()
?
この方法を使うと、どんな利点がありますか?
どのように解決するのですか?
SuppressFinalize
は、ファイナライザを持つクラスからのみ呼び出される必要があります。これは、ガベージコレクタ(GC)に
this
オブジェクトは完全にクリーンアップされました。
推奨される
IDisposable
のパターンは、ファイナライザがある場合に
public class MyClass : IDisposable
{
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// called via myClass.Dispose().
// OK to use any private object references
}
// Release unmanaged resources.
// Set large fields to null.
disposed = true;
}
}
public void Dispose() // Implement IDisposable
{
Dispose(true);
GC.SuppressFinalize(this);
}
~MyClass() // the finalizer
{
Dispose(false);
}
}
通常、CLRはファイナライザーを持つオブジェクトを作成する際に、そのオブジェクトを監視しています(作成コストが高くなる)。
SuppressFinalize
は、オブジェクトが適切にクリーンアップされ、ファイナライザ・キューに入る必要がないことをGCに伝えます。これはC++のデストラクタのように見えますが、そのように動作するわけではありません。
この
SuppressFinalize
なぜなら、オブジェクトはファイナライザーのキューで長い間待たされることになるからです。というのも、オブジェクトはファイナライザーのキューで長い間待たされることになるからです。
SuppressFinalize
を他のオブジェクトの上に置くことをお勧めします。これは重大な欠陥が発生する可能性があります。
を実装している場合は、ファイナライザは不要であると設計指針に記載されています。
IDisposable
を実装する必要があります。
IDisposable
を使用して、決定論的なクラスのクリーンアップを可能にします。
たいていの場合、このように
IDisposable
を使用してリソースをクリーンアップします。ファイナライザーが必要なのは、オブジェクトが管理されていないリソースを保持し、それらのリソースがクリーンアップされることを保証する必要がある場合だけです。
注意: コーダーが自分のデバッグビルドのためにファイナライザーを追加することがあります。
IDisposable
クラスがディスパッチされたことを確認するためです。
IDisposable
オブジェクトを適切に作成します。
public void Dispose() // Implement IDisposable
{
Dispose(true);
#if DEBUG
GC.SuppressFinalize(this);
#endif
}
#if DEBUG
~MyClass() // the finalizer
{
Dispose(false);
}
#endif
関連
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Static readonly」対「const」。
-
[解決済み] .NET Coreと.NET Standard Class Libraryのプロジェクトタイプの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。