Как ресурсы будут освобождены Dispose или Finalize?

У меня три класса. Класс1, Класс2 и Класс3. У меня есть круговая зависимость (от класса 1 до класса 2, от класса 2 до класса 3, от класса 3 до класса 1). Как в этом случае ресурсы будут освобождены методом dispose или finalize()?


person user2538115    schedule 01.07.2013    source источник
comment
Все ли классы реализуют IDisposable?   -  person Cody Gray    schedule 01.07.2013
comment
Более того, я почти уверен, что порядок финализации не определен, а значит, точного ответа вы не получите. Какую проблему ты пытаешься решить? Как вы думаете, зачем вам вообще нужна эта информация?   -  person Cody Gray    schedule 01.07.2013


Ответы (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 для принадлежащих ему классов, поскольку эти экземпляры, возможно, уже были финализированы сборщиком мусора.

person Martin Liversage    schedule 01.07.2013
comment
Я бы хотел, чтобы в .NET было какое-то различие между ссылками, которые инкапсулируют право собственности, и ссылками, которые этого не делают. Хотя в некоторых случаях невозможно избежать ручного Dispose кодирования, на самом деле должна быть возможность, чтобы тип указывал, что он владеет определенными полями, и чтобы компилятор предоставлял способ Dispose для всех полей, которыми владеет объект, чьи типы реализовать IDisposable. - person supercat; 02.07.2013