Контейнер для хранения анонимных методов - PullRequest
3 голосов
/ 26 июля 2011

У меня есть следующее определение.

type
  TOmniTaskDelegate = reference to procedure(const task: IOmniTask);

Какой тип контейнера следует использовать (должен поддерживаться в D2009) для хранения списка экземпляров TOmniTaskDelegate? В настоящее время я использую array of TOmniTaskDelegate, но я не очень доволен этим.

Ответы [ 2 ]

8 голосов
/ 26 июля 2011

Я бы использовал TList<TOmniTaskDelegate>.Поскольку это безопасно для типов из-за использования обобщенных типов, оно будет правильно обрабатывать проблемы времени жизни своих членов.

3 голосов
/ 26 июля 2011

Редактировать : Delphi 2009 включает в себя универсальный TList<T>, я предполагаю, что он реализован с использованием array of, как и в Delphi 2010. Это делает TList<T> оптимальным выбором! Мой первоначальный ответ остается, потому что он объясняет, почему array of является отличной структурой данных и почему не , используя его, доставляет много хлопот.


Ваш выбор array of Anonym выглядит очень хорошо для меня, потому что:

  • Анонимные методы - это управляемые объекты (реализованные с использованием интерфейсов). Они должны быть должным образом доработаны.
  • Динамический массив сам по себе является управляемым типом, обеспечивая правильность завершения ссылок на анонимные методы.
  • Универсальные контейнеры Delphi 2010 реализованы с использованием динамических массивов, поэтому они соответствуют поставленной задаче. Но убедитесь, что вы не увеличиваете свои массивы один за другим, растете кусками.

Если вы используете что-то еще для реализации, вам нужно позаботиться о завершении ссылок самостоятельно. Примеры:

  • Если вы используете простые блоки памяти, вам понадобится деструктор, который намеренно устанавливает для каждого элемента значение nil (то есть: не ZeroMemory или FillChar), чтобы компилятор получил возможность генерировать код завершения.
  • Записи являются управляемыми объектами, и они могут содержать ссылки на динамические методы, но они могут содержать только конечное число ссылок, если вам нужно больше, вам потребуется реализовать своего рода связанный список, а затем вам потребуется осторожно управляйте там жизненным циклом.
  • Классы страдают от всех недостатков записей, и к этому они добавляют свои собственные накладные расходы.
...