Я не на 100 % понимаю, как экземпляр класса A может существовать до тех пор, пока не будет завершен последний экземпляр класса B.
Или, другими словами, я бы хотел, чтобы все B вызывали методы close&dispose в A внутри финализации B... и чтобы это произошло до завершения 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] CLR через C Sharp, 3-е изд. Ч. 21. Объект критического финализатора. В частности, стр. 537 «Использование финализации с управляемыми ресурсами».