Dictionary<TKey, TValue>类继承了ICollection接口,却没有实现它的成员IsSynchronized、SyncRoot(从反编译工具ILSpy中看是没有公开),这是为什么?
我们自己写一个类继承Dictionary<TKey, TValue>所继承的接口,则必须公开实现这些接口的全部成员才能编译通过,难道.Net FrameWork的类库不需要遵循C#的语言规范吗?
http://msdn.microsoft.com/zh-cn/subscriptions/xfhwa508.aspx
ICollection.IsSynchronized | 获取一个值,该值指示是否同步对 ICollection 的访问(线程安全)。 |
ICollection.SyncRoot | 获取可用于同步对 ICollection 的访问的对象。 |
不知道为什么说没实现IsSynchronized
http://msdn.microsoft.com/zh-CN/library/xfhwa508.aspx
我不知道为什么你给出的页面会列出这些成员。但你只要自己写代码创建个实例看看或者对象浏览器中查看中就知道有没有这两个属性了。
@腾格里:
看看这个:
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
}
还是引用msdn
System.Collections.Generic 命名空间中集合的默认实现不同步。
枚举整个集合本质上不是一个线程安全的过程。 若要确保枚举过程中的线程安全,可以在整个枚举过程中锁定集合。 若允许多个线程对集合执行读写操作,您必须实现自己的同步。
个人感觉Dictionary<TKey, TValue>不是一个线程安全的,所以微软不让大家看到IsSynchronized,SyncRoot,看到了也没用...希望大家指点。
原来显式实现接口,只能由接口调用,而不能由类调用,受教了。
可能是因为Dictionary根本就不想做线程安全处理吧,
因为有ConcurrentDictionary<TKey, TValue>吧.