【发布时间】:2017-02-14 04:33:13
【问题描述】:
我发现了一件有趣的事情。 c#,.NET 4.0。 我有一个代表 IDisposable 接口的类。在提到的类中,我有一个函数,它返回 IEnumerable 和 yield return。 在调用时,控件会跳过该函数。不要踏入。 示例:
class Program
{
static void Main(string[] args)
{
using (DispClass d = new DispClass())
{
d.Get2();
d.Get1();
}
}
}
public class DispClass: IDisposable
{
public DispClass()
{
Console.WriteLine("Constructor");
}
public void Dispose()
{
Console.WriteLine("Dispose");
}
public int Get1()
{
Console.WriteLine("Getting one");
return 1;
}
public IEnumerable<int> Get2()
{
Console.WriteLine("Getting 1");
yield return 1;
Console.WriteLine("Getting 2");
yield return 2;
}
}
输出: “建设者” “得到一个” “处置”
“得到 1”、“得到 2”在哪里? 如果没有返回本地列表的收益返回,我可以看到这些......
请解释一下!
【问题讨论】:
-
您需要使用从对
Get2的调用返回的IEnumerable,也许使用foreach语句? -
yield return使该方法(神奇地)返回一个包含方法中代码的枚举器对象。它只是坐在那里等待被枚举,但你永远不会枚举它。你觉得这让人感觉如何?试试d.Get2().ToList(); -
P.S.这就是
yield return的全部目的:有人调用您的方法,但在实际需要之前,没有任何代码实际执行。例如,这允许调用者仅遍历方法中冗长的 foreach 循环的部分,从而节省时间和资源。这是一项功能,而不是错误。 -
你可能想阅读stackoverflow.com/questions/39476/…(以及关于
yield return的类似帖子) -
另外,请阅读 minimal reproducible example 发布示例指南 - 如果您仔细遵循它,您的帖子不会谈论完全不相关的
IDisposable实施...考虑 edit 您的帖子以删除不相关的 IDisposable 引用以及大部分代码或阐明为什么您认为它是帖子的重要部分。
标签: c# idisposable yield