Hei*_*cht 3 delphi generics com interface delphi-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;
Run Code Online (Sandbox Code Playgroud)
以上代码是否合法?
小智 5
除非通过QueryInterface()将接口降级为IUnknown,否则这可能会对您造成问题,因为它可能没有遵守COM规则.
tkInterface的默认IComparer和IEqualityComparer只是将指针值作为四个字节的整数进行比较(因此,在QueryInterface上有完成以返回聚合).在Generics.Defaults中查找tkInterface来查看.
您可以通过在构造列表时提供IComparer或IEqualityComparer来自行避免此问题.
我不认为使用泛型和接口有任何引用计数问题.