3

我想知道使用泛型TList<T>where Tis any interface type (除了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;

上面的代码合法吗?

4

2 回答 2

5

除非接口通过 QueryInterface() 降级为 IUnknown,否则这可能会成为您的问题,因为它可能不遵守 COM 规则。

tkInterface 的默认 IComparer 和 IEqualityComparer 只是将指针值作为四字节整数进行比较(因此,在 QueryInterface 上完成了返回聚合的操作)。在 Generics.Defaults 中查找 tkInterface 以查看。

您可以通过在构建列表时提供 IComparer 或 IEqualityComparer 自己来避免此问题。

我不相信将泛型与接口一起使用会产生任何引用计数问题。

于 2009-05-20T15:11:31.693 回答
1

TInterfaceList 类型对你有用吗?

这是专门为使用接口列表而设计的。

于 2009-02-05T21:10:52.227 回答