Delphi 2009: Возможно ли опасно использовать TList <[любой интерфейс]> с компаратором по умолчанию? - PullRequest
3 голосов
/ 04 февраля 2009

Мне интересно, не опасно ли использование универсального TList<T>, где T - какого-либо типа интерфейса (кроме IUnknown / IInterface) Я интенсивно использую интерфейсы и храню их в списках. Некоторые интерфейсы являются моими собственными, некоторые предоставляются некоторыми COM-интерфейсами, поэтому COM участвует.

Я вижу потенциальную проблему, когда происходит проверка на равенство экземпляров, например, когда я использую Remove метод списка (который внутренне должен сравнить мое предоставленное значение с содержащимися значениями). Согласно COM-правилам вы можете сравнивать только два интерфейса на равенство после приведения их к IUnknown. Я не знаю, знает ли об этом компаратор по умолчанию, связанный с поиском моего интерфейса в TList<T>.

Чтобы проиллюстрировать мой вопрос на примере:

var
  list:TList<IMyInterface>;
  intf:IMyInterface;
begin
  ...
  list:=TList<IMyInterface>.Create;
  list.Add(intf);
  ...
  list.Remove(intf);
end;

Законен ли приведенный выше код?

Ответы [ 2 ]

5 голосов
/ 20 мая 2009

Если интерфейс не понижен до IUnknown через QueryInterface (), существует вероятность того, что это может стать проблемой для вас, поскольку он, возможно, не соблюдал правила COM.

Стандартные IComparer и IEqualityComparer для tkInterface просто сравнивают значения указателя как четыре байтовых целых числа (поэтому в QueryInterface сделано для возврата к агрегату). Ищите tkInterface в Generics. По умолчанию, чтобы увидеть.

Вы можете избежать этой проблемы самостоятельно, предоставив IComparer или IEqualityComparer при создании списка.

Я не верю, что существуют какие-либо проблемы с подсчетом ссылок при использовании обобщенных элементов с интерфейсами.

1 голос
/ 06 февраля 2009

Будет ли у вас работать тип TInterfaceList?

Это специально разработано для работы со списком интерфейсов.

...