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