【发布时间】:2011-08-02 01:33:53
【问题描述】:
看这段代码:
dic:=TObjectDictionary<Integer, TObject>.Create([doOwnsValues]);
testObject:=TObject.Create;
dic.AddOrSetValue(1,testObject);
dic.AddOrSetValue(1,testObject);
代码
- 创建一个拥有所包含值的字典
- 添加值
- 再次添加相同的值,使用相同的键
令人惊讶的是,当你第二次添加对象时,它被释放了。
这是预期的行为吗?还是 Delphi 库中的错误?
文档只是说“如果对象被拥有,当条目从字典中删除时,键和/或值被释放”。所以释放一个我刚刚要求它添加的对象似乎有点奇怪!
有没有办法告诉 TObjectDictionary 不要这样做?目前,每次我添加一个值时,我都必须先检查该键值组合是否已经在字典中。
德尔福 2010
[编辑: 看完所有的cmets:
我的结论(对于它们的价值)]
- 这似乎是预期的行为
- 无法修改此行为
- 不要将 TObjectDictionary(或任何其他类似的类)用于常见的“将这些对象添加到容器中。将它们留在那里。做一些事情。释放容器和您添加的所有对象”用法.如果您正在做更复杂的事情,最好自己管理对象。
- 该行为的文档记录不充分,如果您想真正了解发生了什么,您应该阅读源代码
[/编辑]
【问题讨论】:
-
@everyone 对不起,我错过了所有的论点。我在另一个时区睡着了 ;-)
-
对你的态度多么不体谅。 ;-)
-
为什么不一次又一次地停止尝试添加相同的项目?
-
我就是这么做的。 “每次我添加一个值时,我都必须先检查它是否已经在字典中”
-
"这就是我所做的。"每次我添加一个值时,我都必须先检查它是否已经在字典中":不确定我是否理解 - 你描述的行为只有在你覆盖具有相同值的相同键 - 因此您不必每次都检查值,如果您必须将相同的对象作为值添加到不同的键中,只需维护唯一的键。
标签: delphi delphi-2010