List <T>没有实现SyncRoot!

Luc*_*uca 12 c# collections synchronization

每个人都使用很多List.我需要迭代这个列表,所以我使用已知的SyncRoot模式.

最近我在这篇文章中注意到应该避免使用SyncRoot以支持"嵌入式"线程安全(每个方法将锁定私有对象而不使用SyncRoot属性暴露它).我能理解,部分我同意这一点.

问题是List <T>类没有实现SyncRoot属性,即使实现了ICollection接口,它暴露了SyncRoot属性.我说这会使代码失效

 List<int> list = new List<int>()
 list.SyncRoot;
Run Code Online (Sandbox Code Playgroud)

给我以下编译器错误:

错误CS0117:'System.Collections.Generic.List'不包含'SyncRoot'的定义

...如果这是真的,我怎么能在迭代它时同步List <T>类型的公共属性?

Cha*_*ion 18

它实际上是明确实现的.

object ICollection.SyncRoot
{
    get
    {
        if (this._syncRoot == null)
        {
            Interlocked.CompareExchange(ref this._syncRoot, new object(), null);
        }
        return this._syncRoot;
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着您必须转换ICollection为使用它.

  • @Luca - 我个人会避免依赖`SyncRoot`而是使用新的`System.Collections.Concurrent.BlockingCollection <T>`类.这有助于减少错误,因为您不必锁定列表中的每个操作. (7认同)
  • 确实不鼓励使用SyncRoot,因为它是明确实现的.我发现实现成员在两个场景中特别有用:1.成员的使用在接口之外没有用处(参见例如:http://bit.ly/crLXAz)2.成员尚未实现并抛出一个异常(例如参见这个例子http://bit.ly/3RFzn4,其中`Add`方法对`ReadOnlyDictionary`没有意义). (3认同)