Что является различием в терминах использования памяти (вымойтесь, и т.д.) интерфейсов Интерфейса и C# Delphi

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

6
задан ronaldosantana 22 June 2010 в 21:38
поделиться

5 ответов

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

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

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

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

7
ответ дан 8 December 2019 в 13:43
поделиться

Ключевым различием между Delphi и .NET в этой области, касающейся конкретно интерфейсов, является недетерминированный характер очистки.

В Delphi все интерфейсы используются по модели COM. То есть это подсчет ссылок. Если класс реализует модель управления временем жизни с подсчетом ссылок, то, когда счетчик ссылок падает до нуля, экземпляр объекта уничтожается В ЭТОЙ ТОЧКЕ.

ПРИМЕЧАНИЕ. Управление временем жизни является функцией реализации класса. Чтобы увидеть это наиболее ясно, взглянем на реализацию IUnknown.Выпуск в TInterfacedObject :

function TInterfacedObject._Release: Integer;
begin
  Result := InterlockedDecrement(FRefCount);
  if Result = 0 then
    Destroy;
end;

Если реализация Release не вызвала Destroy , то объект НЕ будет уничтожен, когда счетчик ссылок упадет. к нулю и все равно должен быть явно освобожден через некоторую ссылку на объект. Это можно использовать в Delphi для создания объектов, реализующих интерфейсы, но не подлежащих автоматическому управлению временем жизни с подсчетом ссылок (хотя вы не можете избежать кода подсчета ссылок, введенного компилятором, то есть вызовов AddRef и Выпуск ).

В .NET, прежде всего, нет подсчета ссылок как такового. Сборщик мусора работает гораздо более изощренно, детали которого не имеют прямого отношения к этому обсуждению.

Ключевое отличие состоит в том, что когда объект больше не используется (однако это определяется за пределами простого счетчика ссылок), это НЕ является точкой, в которой он уничтожается в .NET.

На самом деле, теоретически возможно, что неиспользуемые объекты будут накапливаться в вашем приложении до гораздо более позднего момента времени жизни вашего процесса - особенно в приложениях с интенсивными вычислениями с небольшим количеством циклов простоя. В .NET вы просто не можете быть уверены , когда эти неиспользуемые объекты в конечном итоге будут освобождены.

Некоторые утверждают, что это Хорошая вещь , хотя это сбивает с толку обычную практику очистки ресурсов, которые заблокированы или принадлежат объектам, когда эти объекты уничтожены, поскольку обычно вам нужно освободить заблокированные / владеет ресурсами более срочно, чем ожидание сборщика мусора. Именно здесь в .NET появляется IDisposable , детали которого, опять же, не имеют прямого отношения, могут быть исследованы дополнительно на досуге.

8
ответ дан 8 December 2019 в 13:43
поделиться

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

2
ответ дан 8 December 2019 в 13:43
поделиться

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

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

0
ответ дан 8 December 2019 в 13:43
поделиться

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

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

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

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

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

Приветствую

0
ответ дан 8 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: