迷惑,可能遗漏了一些简单的东西..
我有
var q = new Queue<object>();
lock (q.SyncRoot)
{
...
}我得到了
Queue<T> does not provide a defintion for SyncRoot blah blah...但是,Queue<T>实现了ICollection,它将SyncRoot定义为公共属性。
那么,首先,为什么这是隐藏的。其次,如何隐藏正在实现的接口的属性?
发布于 2012-10-05 21:02:59
您可以通过implementing it explicitly隐藏该属性
object MyQueue.SyncRoot { get; set; }它是隐藏的because it's deprecated
我们发现基于SyncRoot的同步API对于大多数场景来说不够灵活。API允许对集合的单个成员进行线程安全访问。问题是,在许多情况下,您需要锁定多个操作(例如,删除一个项目,然后添加另一个项目)。换句话说,通常是代码使用了想要选择(并且可以实际实现)正确的同步策略的集合,而不是集合本身。我们发现SyncRoot实际上很少使用,而且在使用它的情况下,它实际上不会增加太多价值。在不使用它的情况下,它只会给ICollection的实现者带来麻烦。
发布于 2012-10-05 21:02:14
这是“explicit interface implementation”的一个例子。
显式实现接口时,只能通过该实例的该类型的引用访问该方法。换句话说,如果将Queue转换为ICollection,您将看到同步根成员。
https://stackoverflow.com/questions/12746772
复制相似问题