.NET глазами дельфийца. C# - Автоматическое удаление объектов
ОГЛАВЛЕНИЕ
Автоматическое удаление объектов
При программировании в терминах объектов 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 или просто массив, объекты пришлось бы удалять вручную)
- во-вторых, список объектов создается и заполняется в одном месте.
Таким образом, довольно простая вещь - автоматическоеудаление объектов, - позволяет писать более точный (семантически) и понятныйкод.