FinalizeとDisposeの分析
2869 ワード
一.終端可能オブジェクトの構築
カスタムクラスでFinalize()を書き換えると、このオブジェクトをメモリから削除する前に、オブジェクトのFinalize()メソッドを呼び出すことができます.ただし、構造タイプはFinalize()を書き換えることはできません.
このメンバーは保護されるように定義されているので、クラスインスタンスからオブジェクトのFinalize()メソッドをポイントオペレータで直接呼び出すことはできません.
実際には、オブジェクトに表示されない呼び出しFinalize()メソッドは、主にゴミ回収機によって自動的に呼び出されます.
ここでは,Finalize()呼び出しの時間という概念を明確にする.
Finalize()の呼び出しは「自然な」ごみ回収またはGCをプログラムで通過する.Collect()強制回収中.
クラスの構造関数(~を接頭辞とし、構造関数と似ている.ただし、アクセス修飾子を受け入れず、パラメータを与えず、リロードもできない)の形式で書き換えるべきである.そうしないと、コンパイルエラーが発生する.
次の詳細について説明します.
管理スタックにオブジェクトを割り当てると、ライブラリを実行して、そのオブジェクトがカスタムFinalize()メソッドを提供するかどうかを自動的に決定します.もしそうであれば、オブジェクトは終了可能とマークされ、そのオブジェクトを指すポインタは
「≪終了キュー|End Queue|emdw≫」の内部キューにあります.終了キューは、スタックから削除する前に終了しなければならない各オブジェクトを指すゴミ回収器によって維持されるテーブルです.
ゴミ回収器が、1つのオブジェクトを内側から解放する時間を決定すると、エンドキューの各アイテムをチェックし、オブジェクトをスタックからエンドテーブルと呼ばれる別の管理対象にコピーします.
構造上.このとき、次のゴミ回収時に別のスレッドが生成され、到達可能なテーブル内のオブジェクトごとにFinalize()メソッドが呼び出されます.
そのため、本当に1つのオブジェクトを終了するためには、少なくとも2回のゴミ回収が必要です.
まとめ:
Finalize()はゴミ回収機によって自動的に呼び出されるため、呼び出されたときに管理対象オブジェクトがまだ存在するかどうか、すなわち他の管理対象オブジェクトと通信するのは安全ではないと判断できません.したがって、管理対象オブジェクトと交差することはできません.そして、呼び出された
具体的な時間は私たちにも分からない.
二.処置可能オブジェクトの構築
この役割は,オブジェクトユーザがこのオブジェクトを使用しなくなった場合,このオブジェクト参照が役割ドメインから離れる前にDispose()メソッドを手動で呼び出すと仮定する.
ここで、Dispose()は、1つのオブジェクトの非管理リソースを解放するだけでなく、管理リソースを解放するためにも使用できる任意の処理可能オブジェクトに対してDispose()を呼び出す必要があります.これはFinalize()とはかなり違います.
他の管理オブジェクトと通信するのは安全です.理由は簡単です.ゴミ回収機はIDisposableインタフェースをサポートしておらず、Dispose()を呼び出すことはありません.したがって、オブジェクトのユーザがこのメソッドを呼び出すと、オブジェクトはまだ管理スタック上にあり、
スタックに割り当てられた他のすべてのオブジェクトにアクセスできます.
補足:Dispose()メソッドをusingで呼び出すことができます.
最後に、1つのオブジェクトの定義には、上記の2つのリソースをクリーンアップする技術が含まれます.ただし注意Dispose()メソッドにGCを加える.SuppressFinalize(this).ユーザがDispose()を呼び出すと終了する必要がないので、
だから終わりをスキップすることができます.
最後の最後に、もう一度強調します.
Finalize()メソッドでは、特定の呼び出し時間を知ることはできません.管理リソースを処理できません.
Dispose()は、手動で呼び出し、具体的な方法を知っています.これにより、緊急資源を直ちに解放するのに役立ちます.Finalize()より時間的にいいです.管理リソースと非管理リソースを処理できます.
したがって,可能であればクラスを設計する際にFinalize()メソッドを提供することを避ける.時間がかかるからである.できる限りDispose()でクリーンアップ問題を解決します.
//System.Object
public class Object
{
...
protected virtual void Finalize() { }
}
カスタムクラスでFinalize()を書き換えると、このオブジェクトをメモリから削除する前に、オブジェクトのFinalize()メソッドを呼び出すことができます.ただし、構造タイプはFinalize()を書き換えることはできません.
このメンバーは保護されるように定義されているので、クラスインスタンスからオブジェクトのFinalize()メソッドをポイントオペレータで直接呼び出すことはできません.
実際には、オブジェクトに表示されない呼び出しFinalize()メソッドは、主にゴミ回収機によって自動的に呼び出されます.
ここでは,Finalize()呼び出しの時間という概念を明確にする.
Finalize()の呼び出しは「自然な」ごみ回収またはGCをプログラムで通過する.Collect()強制回収中.
クラスの構造関数(~を接頭辞とし、構造関数と似ている.ただし、アクセス修飾子を受け入れず、パラメータを与えず、リロードもできない)の形式で書き換えるべきである.そうしないと、コンパイルエラーが発生する.
次の詳細について説明します.
管理スタックにオブジェクトを割り当てると、ライブラリを実行して、そのオブジェクトがカスタムFinalize()メソッドを提供するかどうかを自動的に決定します.もしそうであれば、オブジェクトは終了可能とマークされ、そのオブジェクトを指すポインタは
「≪終了キュー|End Queue|emdw≫」の内部キューにあります.終了キューは、スタックから削除する前に終了しなければならない各オブジェクトを指すゴミ回収器によって維持されるテーブルです.
ゴミ回収器が、1つのオブジェクトを内側から解放する時間を決定すると、エンドキューの各アイテムをチェックし、オブジェクトをスタックからエンドテーブルと呼ばれる別の管理対象にコピーします.
構造上.このとき、次のゴミ回収時に別のスレッドが生成され、到達可能なテーブル内のオブジェクトごとにFinalize()メソッドが呼び出されます.
そのため、本当に1つのオブジェクトを終了するためには、少なくとも2回のゴミ回収が必要です.
まとめ:
Finalize()はゴミ回収機によって自動的に呼び出されるため、呼び出されたときに管理対象オブジェクトがまだ存在するかどうか、すなわち他の管理対象オブジェクトと通信するのは安全ではないと判断できません.したがって、管理対象オブジェクトと交差することはできません.そして、呼び出された
具体的な時間は私たちにも分からない.
二.処置可能オブジェクトの構築
public interface IDisposable
{
void Dispose();
}
この役割は,オブジェクトユーザがこのオブジェクトを使用しなくなった場合,このオブジェクト参照が役割ドメインから離れる前にDispose()メソッドを手動で呼び出すと仮定する.
ここで、Dispose()は、1つのオブジェクトの非管理リソースを解放するだけでなく、管理リソースを解放するためにも使用できる任意の処理可能オブジェクトに対してDispose()を呼び出す必要があります.これはFinalize()とはかなり違います.
他の管理オブジェクトと通信するのは安全です.理由は簡単です.ゴミ回収機はIDisposableインタフェースをサポートしておらず、Dispose()を呼び出すことはありません.したがって、オブジェクトのユーザがこのメソッドを呼び出すと、オブジェクトはまだ管理スタック上にあり、
スタックに割り当てられた他のすべてのオブジェクトにアクセスできます.
補足:Dispose()メソッドをusingで呼び出すことができます.
最後に、1つのオブジェクトの定義には、上記の2つのリソースをクリーンアップする技術が含まれます.ただし注意Dispose()メソッドにGCを加える.SuppressFinalize(this).ユーザがDispose()を呼び出すと終了する必要がないので、
だから終わりをスキップすることができます.
最後の最後に、もう一度強調します.
Finalize()メソッドでは、特定の呼び出し時間を知ることはできません.管理リソースを処理できません.
Dispose()は、手動で呼び出し、具体的な方法を知っています.これにより、緊急資源を直ちに解放するのに役立ちます.Finalize()より時間的にいいです.管理リソースと非管理リソースを処理できます.
したがって,可能であればクラスを設計する際にFinalize()メソッドを提供することを避ける.時間がかかるからである.できる限りDispose()でクリーンアップ問題を解決します.