困惑,可能会遗漏一些简单的事情......
我有
var q = new Queue<object>();
lock (q.SyncRoot)
{
...
}
我得到了
Queue<T> does not provide a defintion for SyncRoot blah blah...
但是,Queue<T>
实现ICollection
,将SyncRoot
定义为公共财产。
所以,首先,为什么这是隐藏的。其次,如何隐藏正在实现的接口的属性?
答案 0 :(得分:5)
您可以按implementing it explicitly隐藏该属性:
object MyQueue.SyncRoot { get; set; }
我们发现基于SyncRoot的同步API在大多数情况下都不够灵活。 API允许线程安全访问集合的单个成员。问题是,有许多场景需要锁定多个操作(例如删除一个项目并添加另一个项目)。换句话说,通常是使用想要选择(并且可以实际实现)正确同步策略的集合的代码,而不是集合本身。我们发现SyncRoot实际上很少使用,并且在使用它的情况下,它实际上并没有增加太多价值。如果没有使用它,那对ICollection的实施者来说只是一个烦恼。
答案 1 :(得分:2)
这是“explicit interface implementation。”
的一个例子当您明确实现接口时,您可以仅通过该实例的那种类型的引用访问该方法。换句话说,如果您将Queue
投射到ICollection
,您将看到同步根成员。