6

由于 IDictionary 没有 GetOrAdd 和 AddOrUpdate 方法,从 ConcurrentDictionary 到 IDictionary 的转换是否会切断线程安全的实现?

4

5 回答 5

10

结果对象仍然是并发字典。Add 或 Remove 之类的调用使用底层实现 TryAdd 和 TryRemove(它们是线程安全的)。将对象转换为不同的类型不会改变对象本身。

此外,为了澄清起见,您可以使用 ILSpy 之类的工具来查看默认 IDictionary 方法的实现是什么,以及它们是否仍然是线程安全的。

于 2012-04-11T19:04:40.370 回答
6

IDictionary只是一个界面。如果你转换为它,结果是 ConcurrentDictionary 的实现,缺少GetOrAddandAddOrUpdate方法。

据推测,您仍然可以使用Itemproperty 和 AddandContainsKey方法(代替GetOrAddand AddOrUpdate)方法,并且您的转换对象仍然是线程安全的(因为底层实现是 a ConcurrentDictionary)。

于 2012-04-11T19:02:30.753 回答
1

接口不影响实现。它只是没有暴露一些ConcurrentDictionary's 方法。

您可能会发现这个这个有助于理解接口。

于 2012-04-11T19:02:59.023 回答
0

这就像ConcurrentDictionary通过形状的钥匙孔看大物体IDictionary- 你只能看到IDictionary形状,但它仍然是ConcurrentDictionary

于 2012-04-11T19:11:30.593 回答
-2

简短的回答没有。

您正在通过接口操作对象,因此仍在使用具体实现。您不会丢失任何功能或其方法。它们只是不可用。

在旁注中,向下转换时需要显式转换,向上转换时不需要显式转换 - 这样做总是安全的。

于 2012-04-11T19:20:39.613 回答