首页 新闻 会员 周边

请教关于Dictionary<TKey, TValue>类的接口继承问题

0
悬赏园豆:40 [已解决问题] 解决于 2013-05-24 21:55

Dictionary<TKey, TValue>类继承了ICollection接口,却没有实现它的成员IsSynchronized、SyncRoot(从反编译工具ILSpy中看是没有公开),这是为什么?

问题补充:

我们自己写一个类继承Dictionary<TKey, TValue>所继承的接口,则必须公开实现这些接口的全部成员才能编译通过,难道.Net FrameWork的类库不需要遵循C#的语言规范吗?

客家岸田的主页 客家岸田 | 菜鸟二级 | 园豆:404
提问于:2013-05-23 15:09
< >
分享
最佳答案
0

http://msdn.microsoft.com/zh-cn/subscriptions/xfhwa508.aspx

 

  ICollection.IsSynchronized 获取一个值,该值指示是否同步对 ICollection 的访问(线程安全)。
  ICollection.SyncRoot 获取可用于同步对 ICollection 的访问的对象。

不知道为什么说没实现IsSynchronized

收获园豆:30
JustDotNet | 菜鸟二级 |园豆:229 | 2013-05-23 15:55

http://msdn.microsoft.com/zh-CN/library/xfhwa508.aspx

我不知道为什么你给出的页面会列出这些成员。但你只要自己写代码创建个实例看看或者对象浏览器中查看中就知道有没有这两个属性了。

客家岸田 | 园豆:404 (菜鸟二级) | 2013-05-23 18:28

@腾格里: 

看看这个:
    public class test<TKey, TValue> : ICollection
    {
        #region ICollection 成员

        public void CopyTo(Array array, int index)
        {
            throw new NotImplementedException();
        }

        public int Count
        {
            get { throw new NotImplementedException(); }
        }

        public bool IsSynchronized
        {
            get { throw new NotImplementedException(); }
        }
        //public object SyncRoot
        //{
        //    get { throw new NotImplementedException(); }
        //}
        object ICollection.SyncRoot { get { throw new NotImplementedException(); } }
        #endregion

        #region IEnumerable 成员

        public IEnumerator GetEnumerator()
        {
            throw new NotImplementedException();
        }

        #endregion
    }

JustDotNet | 园豆:229 (菜鸟二级) | 2013-05-24 10:29

还是引用msdn

System.Collections.Generic 命名空间中集合的默认实现不同步。

枚举整个集合本质上不是一个线程安全的过程。 若要确保枚举过程中的线程安全,可以在整个枚举过程中锁定集合。 若允许多个线程对集合执行读写操作,您必须实现自己的同步。

个人感觉Dictionary<TKey, TValue>不是一个线程安全的,所以微软不让大家看到IsSynchronized,SyncRoot,看到了也没用...希望大家指点。

JustDotNet | 园豆:229 (菜鸟二级) | 2013-05-24 10:34

原来显式实现接口,只能由接口调用,而不能由类调用,受教了。

客家岸田 | 园豆:404 (菜鸟二级) | 2013-05-24 21:53
其他回答(1)
1

可能是因为Dictionary根本就不想做线程安全处理吧,

因为有ConcurrentDictionary<TKey, TValue>吧.

收获园豆:10
只会造轮子 | 园豆:2274 (老鸟四级) | 2013-05-23 15:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册