ConcurrentDictionary如何实现ICollection接口且将Add成员设为私有?
ConcurrentDictionary如何实现ICollection接口且将Add成员设为私有?
嘿,这个问题问得特别到位!你看到的其实是C#里的显式接口实现特性,这和咱们平时写的普通接口实现完全不是一回事儿~
首先得明确:你说的这个ICollection<KeyValuePair<K,V>>.Add(...)并不是用private修饰符标记的私有方法,而是通过显式接口实现的方式,让它只能通过接口类型访问,在类的实例上直接看不到这个方法。
具体来说,显式接口实现的语法是这样的:
void ICollection<KeyValuePair<K,V>>.Add(KeyValuePair<K,V> item) { // 内部实现逻辑 }
这种写法不需要(也绝对不能)加任何访问修饰符——不管是public还是private都不行,编译器会直接报错。但它的实际效果就是:你不能直接用ConcurrentDictionary的实例调用Add方法,必须先把它转换成ICollection<KeyValuePair<K,V>>类型才能调用。
那ConcurrentDictionary为啥要这么做呢?原因很简单:它是线程安全的集合,官方更推荐大家用TryAdd方法(键存在时返回false,不会抛异常),而不是传统的Add方法(键存在时直接抛出异常)。通过显式实现ICollection的Add方法,就能把这个不太适合并发场景的方法“隐藏”起来,既满足了接口实现的要求(毕竟要实现ICollection接口),又能引导开发者用更合适的API。
如果你自己想试试这种写法,直接用显式接口实现的语法就行,别加private修饰符——加了反而会被编译器拒绝,这就是你之前尝试失败的原因啦~
备注:内容来源于stack exchange,提问作者Miguel Bartelsman
相关产品推荐
相关产品推荐

