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

但是它没有向控制台写入任何内容。什么好主意吗?

C# SynchronizedReadOnlyCollection<T>.Contains ( T, IEq

你的代码有两个问题:

  1. SynchronizedReadOnlyCollection<T>的单参数构造函数接受一个syncRoot object,而不是底层集合,请查看此处有关构造函数的文档

  2. 与其他只读集合包装器不同,SynchronizedReadOnlyCollection<T>还获取所提供集合的快照,而不是保留对底层集合的引用,这可以在源代码中看到。

完全诚实,我无法想象曾经使用SynchronizedReadOnlyCollection<T>,如果它维护了对底层集合的引用,它可能有一些用途,但是当它拍摄快照时,它对我来说似乎100%无用,为什么要锁定只能读取的资源?这和事实,它甚至没有实现IReadOnlyCollection<T>,我不会费心尝试使用它。

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

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

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