Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 覆盖率,可枚举。其中(此…)和IDisposable_C#_.net_Linq_Ienumerable_Idisposable - Fatal编程技术网

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来重写他们的东西。这个问题似乎已不复存在。