У меня три класса. Класс1, Класс2 и Класс3. У меня есть круговая зависимость (от класса 1 до класса 2, от класса 2 до класса 3, от класса 3 до класса 1). Как в этом случае ресурсы будут освобождены методом dispose или finalize()?
Как ресурсы будут освобождены Dispose или Finalize?
Ответы (1)
Когда вы применяете IDisposable
к объекту, вы также принимаете решение о праве собственности. Если Class1
имеет ссылку на Class2
, вы должны решить, владеет ли Class1
Class2
или он просто хранит ссылку. Если Class1
владеет Class2
, а Class2
является IDisposable
, то Class1
также должен реализовать IDisposable
, а Class1
должен вызывать Dispose
по ссылке Class2
в методе Dispose
, но только при явном вызове, а не при завершении.
Поскольку IDisposable
также определяет иерархию владения, у вас не может быть циклических зависимостей при удалении. Конечно, Class1
может владеть Class2
, которому принадлежит Class3
, а Class3
может иметь ссылку на Class1
, но поскольку Class3
не владеет Class1
, он не должен вызывать Dispose
по ссылке при удалении.
Во время финализации класс, реализующий IDisposable
, должен освобождать только неуправляемые ресурсы и не вызывать Dispose
для принадлежащих ему классов, поскольку эти экземпляры, возможно, уже были финализированы сборщиком мусора.
Dispose
кодирования, на самом деле должна быть возможность, чтобы тип указывал, что он владеет определенными полями, и чтобы компилятор предоставлял способ Dispose
для всех полей, которыми владеет объект, чьи типы реализовать IDisposable
.
- person supercat; 02.07.2013
IDisposable
? - person Cody Gray   schedule 01.07.2013