从ConcurrentDictionary到IDictionary的转换是否会切断线程安全的实现,因为IDictionary没有GetOrAdd和AddOrUpdate方法?
答案 0 :(得分:10)
结果对象仍然是并发字典。像Add或Remove这样的调用使用底层实现TryAdd和TryRemove(它们是线程安全的)。将对象转换为其他类型不会更改对象本身。
另外,为了澄清,您可以使用ILSpy之类的工具来查看默认IDictionary方法的实现以及它们是否仍然是线程安全的。
答案 1 :(得分:6)
IDictionary
只是一个界面。如果转换为它,结果是ConcurrentDictionary的实现,缺少GetOrAdd
和AddOrUpdate
方法。
据推测,您仍然可以使用Item
属性以及Add
和ContainsKey
方法(代替GetOrAdd
和AddOrUpdate
)方法,以及您的转换对象仍然是线程安全的(因为底层实现是ConcurrentDictionary
)。
答案 2 :(得分:1)
答案 3 :(得分:0)
通过ConcurrentDictionary
形状的钥匙孔查看大IDictionary
个对象 - 您只能看到IDictionary
形状,但它仍然是ConcurrentDictionary
。
答案 4 :(得分:-1)
简短回答否。
您正在通过接口操作对象,因此仍然使用具体实现。您没有丢失任何功能或方法。它们不可用。
在旁注中,你需要在向下转换时进行显式转换,在向上转换时不需要显式转换 - 总是安全的。