gpt4 book ai didi

德尔福2009 : Is it possibly dangerous to use TList<[any interface]> with default comparator?

转载 作者:行者123 更新时间:2023-12-03 15:49:21 26 4
gpt4 key购买 nike

我想知道是否使用通用 TList<T>哪里T任何接口(interface)类型( IUnknown/IInterface 除外)都可能是危险的。我大量使用界面并将它们存储在列表中。有些接口(interface)是我自己的,有些是一些COM接口(interface)提供的,所以涉及到COM。

我发现一个潜在的问题,即检查实例是否相等,例如当我使用Remove时列表的方法(内部需要将我提供的值与包含的值进行比较)。根据 COM 规则,您只能在将两个接口(interface)强制转换为 IUnknown 后比较它们是否相等。 。我不知道默认比较器是否参与在 TList<T> 中查找我的接口(interface)意识到这一点。

用一个例子来说明我的问题:

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

上面的代码合法吗?

最佳答案

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

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

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

我不认为将泛型与接口(interface)一起使用会出现任何引用计数问题。

关于德尔福2009 : Is it possibly dangerous to use TList<[any interface]> with default comparator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/512035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com