【发布时间】:2017-03-30 10:42:24
【问题描述】:
在查看 Microsoft 对各种 C# LINQ 方法的实现时,我注意到公共扩展方法只是以单独的迭代器函数的形式返回实际实现的包装器。
例如(来自 System.Linq.Enumerable.cs):
public static IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) {
if (first == null) throw Error.ArgumentNull("first");
if (second == null) throw Error.ArgumentNull("second");
return ConcatIterator<TSource>(first, second);
}
static IEnumerable<TSource> ConcatIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second) {
foreach (TSource element in first) yield return element;
foreach (TSource element in second) yield return element;
}
是什么原因把迭代器这样包装,而不是把它们合二为一,直接返回迭代器?
像这样:
public static IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) {
if (first == null) throw Error.ArgumentNull("first");
if (second == null) throw Error.ArgumentNull("second");
foreach (TSource element in first) yield return element;
foreach (TSource element in second) yield return element;
}
【问题讨论】:
-
@ivan 很有趣... 随便用 C# 7.0 的一个特性可以缓解/规避
yield的特殊性