2015-08-28 68 views
-2

当我打电话:C#SynchronizedReadOnlyCollection <T>。载(T,的IEqualityComparer <T>)

SynchronizedReadOnlyCollection<T>.Contains (T, IEqualityComparer<T>) 

它未能拨打:

IEqualityComparer<T>.Equals(T x, T y) 

我有样本代码在这里:

https://github.com/user7251/repo1/blob/master/SynchReadOnlyList_Demo/SynchReadOnlyList_Demo/SynchronizedReadOnlyCollection_Demo.cs

它执行此行:

bool r = _order.Products.Contains (p, Product.s_ProductByNameEqualityComparer); 

所以应该执行该行:

Console.Out.WriteLine (string.Concat ("ProductByNameEqualityComparer.Equals(){", x.Name, "}{", y.Name, "}")); 

但它没有写入控制台。有任何想法吗?

+3

如果您花了一点时间编写一个简短但完整的程序来隔离问题,并将其包含在您的帖子中,而不是链接到外部源,那将会更加有用。 – sstan

+0

我已经这样做了:https://github.com/user7251/repo1/tree/master/SynchReadOnlyList_Demo – user1074214

+0

链接到GitHub上的代码有什么问题? – user1074214

回答

0

Order.Products中没有任何项目。您将项目添加到内部_products列表中,但您永远不会更改_productsSol

_productsSol = new SynchronizedReadOnlyCollection<Product> (_products);}创建一个新的只读集合,其中当前 _products的内容是空的。当_products更改时,它不会更新其内容。如果有的话,它不会是只读集合。

+0

SynchronizedReadOnlyCollection有一个对原始列表的引用,它不会复制列表 – user1074214

+0

不能复制列表,请参阅参考资料源https://github.com/Microsoft/referencesource/blob/master/ System.ServiceModel/System/ServiceModel/SynchronizedReadOnlyCollection.cs – shf301

+0

你是对的,它复制列表 – user1074214

2

有两个问题与您的代码:

  1. SynchronizedReadOnlyCollection<T>单参数构造函数使用SyncRoot上object,而不是底层集合,看看周围的构造here的文档。

  2. 不同于其他只读的集合包装器,所述SynchronizedReadOnlyCollection<T>也需要所提供的集合的快照而不是保持底层集合的引用,这可以在源代码here看到。

完美地老实说,我不能用SynchronizedReadOnlyCollection<T>过,如果保持底层集合它可能有一些使用参考想象,但它需要一个快照,似乎100%对我没用,为什么锁定只能读取的资源?事实上,它甚至不实施IReadOnlyCollection<T>,我不打算尝试使用它。

从这种类型派生出来并使用Items属性来改变底层集合可能有一个用例,但是我没有看到这样做的例子。

+0

我错误地通过了List而不是“object syncRoot”。我的错,但我认为SynchronizedReadOnlyCollection ctor不应该采用“对象syncRoot”,而应该为类型安全采取“锁定syncRoot”,其中Lock只是简单的一个“class Lock:object {}”,或者更好的是它应该使用ReaderWr iterLockSlim。 – user1074214

+0

@ user1074214带有'makeCopy'参数的ctor是内部的,所以你不能使用它。 – Lukazoid

+0

带有makeCopy参数的ctor应该是公开的。 – user1074214

相关问题