クラスBの最後のインスタンスがファイナライズされるまで、クラスAのインスタンスが存在するように定義する方法については、100% 明確ではありません。
または、言い換えれば、すべての BがBのファイナライズ内でA のclose&dispose メソッドを呼び出すようにしたいと思います...そして、それはA自体がファイナライズされる前に行われます。
シナリオ:
A. アンマネージド リソース用のマネージド ラッパーがあります。類推のために、Aをファイルシステムと呼びましょう
B. A を参照するマネージド リソースで、A ラッパーを介してアンマネージド リソースを要求したもの。類推のために、B をファイルと呼びましょう。
追加のリクエスト --> using 構文がうまく動作するようにしてください。つまり、dispose を明示的に呼び出しても、アンマネージ リソースは破棄されません。オブジェクトはオブジェクト プールに存在します。オブジェクトプールを離れたときにのみ破棄する必要があります。
class SomeClass() : IDisposable{
public SomeClass(){}
public ~SomeClass(){
// dispose of unmanaged here?
}
// Dispose(bool disposing) executes in two distinct scenarios.
// If disposing equals true, the method has been called directly
// or indirectly by a user's code. Managed and unmanaged resources
// can be disposed.
// If disposing equals false, the method has been called by the
// runtime from inside the finalizer and you should not reference
// other objects. Only unmanaged resources can be disposed.
public void Dispose(bool disposing) {
if (disposing) {
// dispose managed
} else {
// dispose unmanaged?
}
}
public void Dispose() {
Dispose(true);
//GC.SuppressFinalize(this);
}
}
参考文献:
[1] Finalize メソッドをオーバーライドできない理由
[2] Cシャープ第3版によるCLR。Ch。21. CriticalFinalizerObject。特に pp. 537「マネージド リソースでファイナライズを使用する」