C# 覆盖率,可枚举。其中(此…)和IDisposable
所以代码分析告诉我,C# 覆盖率,可枚举。其中(此…)和IDisposable,c#,.net,linq,ienumerable,idisposable,C#,.net,Linq,Ienumerable,Idisposable,所以代码分析告诉我,Enumarble.Where(this…返回WhereListIterator的实例,它(看起来)是.NET框架中实现IDisposable的内部类型 Coverity不喜欢取消处置IDisposable,因此建议我处置所述实例。显然,我无法在不进行类型检查的情况下处理该实例,因为是可枚举的。其中(this…被称为返回IEnumerable,它不会从IDisposable中删除 我的问题是:.NET是希望我处理WhereListIterator,还是希望迭代器处理自己(比如
Enumarble.Where(this…
返回WhereListIterator
的实例,它(看起来)是.NET框架中实现IDisposable
的内部类型
Coverity不喜欢取消处置IDisposable,因此建议我处置所述实例。显然,我无法在不进行类型检查的情况下处理该实例,因为是可枚举的。其中(this…
被称为返回IEnumerable
,它不会从IDisposable
中删除
我的问题是:.NET是希望我处理WhereListIterator
,还是希望迭代器处理自己(比如,在每次枚举之后)。如果不希望我处理它,那么为什么要实现接口?这就引出了第三个稍微无关的问题:如果显式实现了IDisposable
,Coverity(代码分析)还会认为我应该处理它吗
代码示例:
var myList = new List<int>{ 1, 2, 3, 4 };
var evenNumbers = myList.Where(x => x % 2 == 0);
foreach(var number in evenNumbers)
{
Console.WriteLine(number);
}
if(evenNumbers is IDisposable)
{
((IDisposable)evenNumbers).Dispose(); // This line will be executed
}
var myList=新列表{1,2,3,4};
var evenNumbers=myList.Where(x=>x%2==0);
foreach(变量数,单位为偶数)
{
控制台写入线(编号);
}
如果(偶数可识别)
{
((IDisposable)evenNumbers).Dispose();//将执行此行
}
不,您不需要自己处理它。请注意,您可以在不需要LINQ的情况下演示此类内容。在本例中,我相信其中ListIterator
实际上是一个手写类,但迭代器块显示了类似的内容:
using System;
using System.Collections.Generic;
public class Program
{
static void Main(string[] args)
{
var empty = Empty();
Console.WriteLine(empty is IDisposable); // Prints True
}
static IEnumerable<string> Empty()
{
yield break;
}
}
使用系统;
使用System.Collections.Generic;
公共课程
{
静态void Main(字符串[]参数)
{
var empty=empty();
Console.WriteLine(空是IDisposable);//打印为True
}
静态IEnumerable Empty()
{
屈服断裂;
}
}
它真正实现了IDisposable
,因为它不仅实现了IEnumerable
,而且还实现了IEnumerator
,作为一种优化—在通常情况下,您只迭代一次,iterable也充当迭代器。foreach
循环将隐式处理IEnumerator
,除非进行迭代,否则不需要处理它
基本上,你在这里很好——尽管很遗憾Coverity警告你这一点。(老实说,我自己也没有使用过Coverity——我不知道您是否可以在这里调整它的行为。)如果您没有使用foreach循环并使用旧的迭代方式
var v = new List<int>() { 1,2,3};
var enumerator = v.GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
var v=newlist(){1,2,3};
var枚举器=v.GetEnumerator();
while(枚举数.MoveNext())
{
Console.WriteLine(枚举器.Current);
}
然后您应该调用Dispose方法foreach循环会自动代表您调用Dispose;如果代码分析工具不知道这个事实,那么您可能应该使用更准确的代码分析工具。你可以考虑把它作为一个bug报告给工具的维护者。这完全是我的想法,但是我不应该固执,我想我应该问问社区。或者,你应该等待那些生产分析工具的人雇佣Eric Lippert来重写他们的东西。这个问题似乎已不复存在。