C# SynchronizedReadOnlyCollection<T>.Contains ( T, IEq
本文关键字:IEq Contains gt SynchronizedReadOnlyCollection lt | 更新日期: 2023-09-27 18:10:11
当我调用:
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, "}" ) );
但是它没有向控制台写入任何内容。什么好主意吗?
你的代码有两个问题:
-
SynchronizedReadOnlyCollection<T>
的单参数构造函数接受一个syncRootobject
,而不是底层集合,请查看此处有关构造函数的文档 -
与其他只读集合包装器不同,
SynchronizedReadOnlyCollection<T>
还获取所提供集合的快照,而不是保留对底层集合的引用,这可以在源代码中看到。
完全诚实,我无法想象曾经使用SynchronizedReadOnlyCollection<T>
,如果它维护了对底层集合的引用,它可能有一些用途,但是当它拍摄快照时,它对我来说似乎100%无用,为什么要锁定只能读取的资源?这和事实,它甚至没有实现IReadOnlyCollection<T>
,我不会费心尝试使用它。
可能有一个用例,当从这个类型派生并使用Items
属性来改变底层集合时,但是我没有看到这样做的例子。
Order.Products
中没有项目。您可以向内部_products
列表添加项目,但永远不会更改_productsSol
。
_productsSol = new SynchronizedReadOnlyCollection<Product> ( _products );}
用_products的当前内容创建一个新的只读集合,该集合为空。当_products
更改时,它不会更新其内容。