如何/为什么SyncRoot隐藏在队列<t>上?</t>

时间:2012-10-05 12:58:18

标签: c# c#-4.0 interface

困惑,可能会遗漏一些简单的事情......

我有

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

我得到了

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

但是,Queue<T>实现ICollection,将SyncRoot定义为公共财产。

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

2 个答案:

答案 0 :(得分:5)

您可以按implementing it explicitly隐藏该属性:

    object MyQueue.SyncRoot { get; set; }

隐藏because it's deprecated

  

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

答案 1 :(得分:2)

这是“explicit interface implementation。”

的一个例子

当您明确实现接口时,您可以通过该实例的那种类型的引用访问该方法。换句话说,如果您将Queue投射到ICollection,您将看到同步根成员。

相关问题