.NET глазами дельфийца. C#
Страница 9. Автоматическое удаление объектов


Автоматическое удаление объектов

При программировании в терминах объектов Delphi приходится постоянноучитывать, когда создаются объекты определенного класса и, что еще важнее, ктои когда их удаляет.

Ситуация несколько упрощается при построении визуальныхприложений и использовании компонентов - установив компонент на форму (илимодуль данных), тем самым мы определяем механизм создания и удаления объектовсоответствующего класса, когда форма-владелец создает объект в процессе своейинициализации и удаляет его в момент своего удаления.

При построении невизуальных приложений (например,реализация бизнес-правил на промежуточном слое многоуровневого приложения)можно использовать механизм автоматического удаления COM-объектов или объектов(объектов, являющихся наследниками от TInterfacedObject).

Впрочем, необходимо признать, что автоматическое удалениеобъектов в Delphiреализовано не лучшим образом, т.к.:

  • приходится использовать две или даже три разные модели программирования для визуальных и невизуальных приложений (управление компонентами посредством формы-владельца, интерфейсные объекты, COM-объекты);
  • при использовании COM-объектов отладка не является прозрачной с точки зрения объектной модели Delphi, т.к. в целях совместимости со стандартами OLE приходится соблюдать ряд ограничений, в т.ч. в вопросах генерации ошибок, совместимых с COM.

Более того, объекты Delphi, которые часто используются припостроении прикладных объектов, например, списки, стеки, битовые массивы и пр.,не поддерживают механизм автоматического удаления, поэтому на практикеприходится или использовать смешанную модель, в которой лишь некоторые объектыудаляются автоматически, или в целях стандартизации кода вообще отказываться отавтоматического удаления.

Рассмотрим простую семантическую конструкцию - загрузкусписка объектов.

В Delphi типичная реализация выглядят примерно так:


procedure LoadList(aList: TObjectList);
begin
aList.Clear;
// заполнение списка
end;
. . .
try
MyObjectList = TObjectList.Create;
LoadList(MyObjectList);
// далее - использование объектов из списка
finally
MyObjectList.Free;
end;

На самом деле из-за ограничений Delphi (TObjectList не может удаляться автоматически)семантика приведенного кода разбивается на две отдельные фазы:

  • создать пустой список объектов
  • заполнить список

В C# аналогичное действие (загрузка списка объектов) реализуется проще исемантически точнее:


class ListLoadTest {
Collection LoadList() {
Collection c = new Collection();
// непосредственная загрузка объектов и добавление их в коллекцию
return c;
}
static void Main() {
Collection c = LoadList();
foreach (MyObject in c) {
// что-то сделать с очередным объектом из списка
}
}
}

Строго говоря, в приведенном коде C# даже два преимущества:

  • во-первых, не нужно думать об удалении списка объектов и его элементов (если бы в Delphi для хранения объектов вместо TObjectList использовался бы TList или просто массив, объекты пришлось бы удалять вручную)
  • во-вторых, список объектов создается и заполняется в одном месте.

Таким образом, довольно простая вещь - автоматическоеудаление объектов, - позволяет писать более точный (семантически) и понятныйкод.

 
« Предыдущая статья   Следующая статья »