【问题标题】:C# SynchronizedReadOnlyCollection<T>.Contains ( T, IEqualityComparer<T> )C# SynchronizedReadOnlyCollection<T>.Contains (T, IEqualityComparer<T>)
【发布时间】:2015-08-28 13:45:53
【问题描述】:

当我打电话时:

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, "}" ) );

但它不会向控制台写入任何内容。有什么想法吗?

【问题讨论】:

  • 如果您花一点时间编写一个简短但完整的程序来隔离问题并将其包含在您的帖子中,而不是链接到外部资源,那将会更加有用。
  • 链接到 GitHub 上的代码有什么问题?
  • How do I ask a good question?: “不要只是在整个程序中复制......包含足够的代码以允许其他人重现问题”“但也要在问题本身中包含代码。并非每个人都可以访问外部网站,并且链接可能会随着时间的推移而中断。”

标签: c# contains iequalitycomparer


【解决方案1】:

您的代码有两个问题:

  1. SynchronizedReadOnlyCollection&lt;T&gt; 的单参数构造函数需要一个syncRoot object,而不是底层集合,请查看构造函数here 周围的文档。

  2. 与其他只读集合包装器不同,SynchronizedReadOnlyCollection&lt;T&gt; 还对提供的集合进行快照,而不是保留对底层集合的引用,这可以在源代码 here 中看到。

老实说,我无法想象曾经使用过SynchronizedReadOnlyCollection&lt;T&gt;,如果它保持对底层集合的引用,它可能会有一些用处,但是当它拍摄快照时,对我来说似乎 100% 没用,为什么要锁定围绕只能读取的资源?再加上它甚至没有实现IReadOnlyCollection&lt;T&gt;,我不会费心去尝试使用它。

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

【讨论】:

  • 我错误地传递了一个列表而不是一个“对象同步根”。我的错,但我认为 SynchronizedReadOnlyCollection ctor 不应该采用“对象 syncRoot”。相反,它应该采用“Lock syncRoot”来保证类型安全,其中 Lock 只是一个“class Lock : object {}”。或者更好的是,它应该使用 ReaderWriterLockSlim。
  • @user1074214 带有makeCopy 参数的ctor是内部的,所以你不能使用它。
  • 带有 makeCopy 参数的 ctor 应该是公开的。
  • 使用 ReaderWriterLockSlim 是有意义的,因为它与 SynchronizedReadOnlyCollection 之外的代码共享锁。
  • @user1074214 听起来你最好实现自己的SynchronizedReadOnlyCollection&lt;T&gt; 版本,或者更好的是,使用ConcurrentBag&lt;T&gt;
【解决方案2】:

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

_productsSol = new SynchronizedReadOnlyCollection&lt;Product&gt; ( _products );} 使用 _products 的 current 内容创建一个新的只读集合,该集合为空。当_products 更改时,它不会更新其内容。如果是这样,它就不是只读集合。

【讨论】:

  • SynchronizedReadOnlyCollection 有对原始 List 的引用。它不会复制列表。
  • 不,它会复制列表。自己查看参考源。 github.com/Microsoft/referencesource/blob/master/…
  • ReadOnlyCollection 复制对列表的引用。它不复制数据结构。我错误地认为 SynchronizedReadOnlyCollection 也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多