【发布时间】:2017-03-29 10:47:51
【问题描述】:
这是Why doesn't generic ICollection implement IReadOnlyCollection in .NET 4.5?的扩展
设计和兼容性是主要原因。
当一个方法需要同时获取 ICollection 和 IReadCollection 作为参数时,最简单的解决方案是使用 IEnumerable 代替,因为它们都扩展了它。
然后,可以使用 Linq Count() 方法而不是直接使用 Count 属性。
这是来自https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,41ef9e39e54d0d0b的 System.Linq.Enumerable.cs 的摘录
public static int Count<TSource>(this IEnumerable<TSource> source) {
if (source == null) throw Error.ArgumentNull("source");
ICollection<TSource> collectionoft = source as ICollection<TSource>;
if (collectionoft != null) return collectionoft.Count;
ICollection collection = source as ICollection;
if (collection != null) return collection.Count;
int count = 0;
using (IEnumerator<TSource> e = source.GetEnumerator()) {
checked {
while (e.MoveNext()) count++;
}
}
return count;
}
它首先检查它是否是一个集合,在这种情况下直接返回 Count,这样性能成本就会降到最低。 但是,为什么这个 Count() 的实现没有与 IReadOnlyCollection 进行类似的检查?
我认为兼容性不是问题:使用 .NET
【问题讨论】:
-
我会猜,因为它不像
ICollection那样通用,它由所有集合类型实现。在性能方面检查每个声明 Count 属性的接口是不合理的。 -
这对于内置集合来说不是问题,因为它们都实现了 ICollection。
标签: c# linq generics collections