В чем разница с точки зрения использования памяти (очистки и т. Д.) Интерфейсов Delphi и C # - PullRequest
6 голосов
/ 23 июня 2010

Я программист на Delphi и пытаюсь кое-что сделать с C # здесь. Работает ли интерфейс в C # так же, как в Delphi - вам не нужно беспокоиться об освобождении его, поскольку он освобождается, когда он выходит за рамки.

Ответы [ 5 ]

8 голосов
/ 23 июня 2010

Ключевое различие между 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, подробности, которые снова не имеют прямого отношения, могут быть изучены в дальнейшем на вашем досуге.

7 голосов
/ 23 июня 2010

Да, для программиста они выглядят одинаково. Используйте и забудьте.

Внутренне они работают по-разному, в .NET интерфейс - это (просто еще одна) ссылка, которая обрабатывается сборщиком мусора.

В интерфейсах Delphi есть особый вид ссылок, которые подсчитываются (другой метод управления Meory).

Основное отличие .NET / Delphi состоит в том, что в .NET все ссылки (интерфейс, объект и массив) являются сборщиком мусора.

2 голосов
/ 23 июня 2010

Я не думаю, что он освобождается, когда выходит за рамки, но когда происходит сборка мусора (когда они больше не используются)

0 голосов
/ 23 июня 2010

Управление памятью осуществляется CLR. Сборка мусора является встроенной службой в CLR.

Вам не нужно обнулять переменные или поля, чтобы объект собирался сборщиком мусора.

Вам не нужно реализовывать или использовать IDisposable для очистки памяти. Метод Dispose ничего не делает для освобождения управляемых объектов в памяти. Метод Dispose должен использоваться для освобождения «неуправляемых» ресурсов, включая соединения с базой данных, растровые изображения или любые неуправляемые структуры, которые вы можете удерживать.

Если вы говорите об интерфейсах, таких как визуальные компоненты (формы, диалоги и т. Д.), Это немного запутывает. Я полагаю, что в WinForms интерфейс (визуальный) больше не виден, он будет очищен и собран мусором. Форма будет воссоздана снова, когда это необходимо. В WPF Windows и страницы не сразу уничтожаются. Они кэшируются на весь срок службы приложения, если они не были специально очищены разработчиком приложения. Это повышает производительность приложений WPF, но накладывает дополнительное бремя необходимости беспокоиться о ресурсах в приложении.

Сборка мусора - это совершенно отдельная тема. Фактическое освобождение управляемых объектов из физической памяти происходит здесь и полностью зависит от службы сборки мусора, и вам обычно не нужно беспокоиться о том, как это работает.

Приветствия

0 голосов
/ 23 июня 2010

Все в c # является сборщиком мусора, поэтому вам не нужно освобождать их вручную.

Но есть существенные различия. Интерфейсы Delphi подсчитывают ссылки, интерфейсы c # - сборщик мусора. C # поддерживает множественное наследование интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...