5

很困惑,可能会遗漏一些简单的东西..

我有

var q = new Queue<object>();
lock (q.SyncRoot)
{
    ...
}

我明白了

Queue<T> does not provide a defintion for SyncRoot blah blah...

但是,定义为公共属性的Queue<T>工具。ICollectionSyncRoot

所以,首先,为什么要隐藏这个。其次,如何隐藏正在实现的接口的属性?

4

2 回答 2

6

您可以通过显式实现来隐藏该属性:

    object MyQueue.SyncRoot { get; set; }

它是隐藏的,因为它已被弃用

我们发现基于 SyncRoot 的同步 API 在大多数情况下不够灵活。API 允许线程安全地访问集合的单个成员。问题是在许多情况下您需要锁定多个操作(例如删除一个项目并添加另一个项目)。换句话说,通常是使用集合的代码想要选择(并且可以实际实现)正确的同步策略,而不是集合本身。我们发现 SyncRoot 实际上很少使用,在使用它的情况下,它实际上并没有增加太多价值。在不使用它的情况下,它只会让 ICollection 的实现者感到烦恼。

于 2012-10-05T13:02:59.260 回答
3

它是“显式接口实现”的一个例子。

当您显式实现接口时,您只能通过该实例的该类型的引用来访问该方法。换句话说,如果您将其Queue转换为ICollection,您将看到同步根成员。

于 2012-10-05T13:02:14.043 回答