Ключевое различие между Delphi и .NET в этой области, особенно касающееся интерфейсов, заключается в недетерминированном характере очистки.
В Delphi все использование интерфейса соответствует модели COM. То есть это ссылка подсчитана. Если в классе реализована модель управления временем жизни с подсчетом ссылок, то когда счетчик ссылок падает до нуля, экземпляр объекта уничтожается НА ЭТОЙ ТОЧКЕ.
ПРИМЕЧАНИЕ. Управление временем жизни является функцией реализации класса. Чтобы увидеть это наиболее наглядно, взгляните на реализацию IUnknown.Release in TInterfacedObject :
function TInterfacedObject._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
if Result = 0 then
Destroy;
end;
Если бы реализация Release не вызывала Destroy , тогда объект НЕ был бы уничтожен, когда счетчик ссылок упал до нуля, и все равно должен был бы быть явно Free'd through некоторая ссылка на объект. Это можно использовать в Delphi для создания объектов, которые реализуют интерфейсы, но которые не подлежат автоматическому управлению временем жизни с подсчетом ссылок (хотя вы не можете избежать кода подсчета ссылок, введенного компилятором, то есть вызовов AddRef и Release ).
Во-первых, в .NET нет подсчета ссылок как такового. Сборщик мусора работает гораздо более изощренно, детали которого не имеют прямого отношения к этому обсуждению.
Ключевое отличие состоит в том, что когда объект больше не используется (однако это определяется не просто подсчетом ссылок), это НЕ точка, в которой он уничтожается в .NET.
Фактически, теоретически возможно, что неиспользуемые объекты будут накапливаться в вашем приложении до гораздо более поздней точки времени жизни вашего процесса - особенно в приложениях с интенсивными вычислениями и несколькими циклами простоя. В .NET вы просто не можете быть уверены, точно , когда эти неиспользуемые объекты в конечном итоге будут свободны.
Некоторые утверждают, что это A Good Thing , хотя это сбивает с толку обычную практику очистки ресурсов, которые заблокированы или принадлежат объектам, когда эти объекты уничтожены, поскольку обычно вам необходимо освободить заблокированные объекты. / принадлежат ресурсы более срочно, чем это дает ожидание сборщика мусора. Здесь IDisposable входит в .NET, подробности, которые снова не имеют прямого отношения, могут быть изучены в дальнейшем на вашем досуге.