C#:using 语句中的 IEnumerator<T>
-
06-09-2019 - |
题
我很好奇如何 SingleOrFallback
方法实施于 更多Linq 并发现了一些我以前从未见过的东西:
public static T SingleOrFallback<T>(this IEnumerable<T> source, Func<T> fallback)
{
source.ThrowIfNull("source");
fallback.ThrowIfNull("fallback");
using (IEnumerator<T> iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
{
return fallback();
}
T first = iterator.Current;
if (iterator.MoveNext())
{
throw new InvalidOperationException();
}
return first;
}
}
为什么是 IEnumerator<T>
在一个 using
陈述?这是使用时应该考虑的问题吗? foreach
在一个 IEnumerable<T>
还?
附带问题: 这个方法到底做了什么?当源序列不恰好包含一项时,它是否会返回后备项?
解决方案
IEnumerator<T>
延伸 IDisposable
, , 那么你 应该 将其放在 using 语句中。 foreach
自动执行此操作。(非泛型 IEnumerator
不 延长 IDisposable
但C#编译器仍然生成代码来调用 Dispose
有条件的。这是 C# 1.0 和 1.2 之间的(少数)更改之一,由于某种原因,其中 1.2 是随 .NET 1.1 一起发布的版本。)
这是一篇文章 解释为什么这在迭代器块的上下文中很重要。
至于该方法的作用:
- 如果序列为空,则返回后备项
- 如果序列只有一项,则返回它
- 如果序列有多于一项,则抛出异常
附:很高兴看到 MoreLinq 得到了一些关注:)
其他提示
一些统计员表现不好,如果处置不叫;这是针对非泛型的人作为一般的人(非一般的人需要的代码或者鸭式的Dispose调用或者强制转换为IDisposable接口,然后调用IDisposable.Dispose)同样如此。这是好习惯的问题,确保了IEnumerator对象得到处置;我认为有必要,它接受未知类型的IEnumerable任何例程的正确性。
不隶属于 StackOverflow