我发现了一件有趣的事情。 c#,。NET 4.0。 我有一个代表IDisposable接口的类。在上面提到的类中我有一个函数,返回IEnumerable并返回yield。 在调用时,controll跳过该函数。不要介入。 例如:
&out_len
输出: “构造” “得到一个” “处置”
“获得1”,“获得2”在哪里? 如果没有收益率返回并返回本地列表,我可以看到这些......
请解释一下!
答案 0 :(得分:5)
这是预期的行为和设计。当您使用yield
时,实际发生的是Get2
方法返回由编译器自动实现的类型的实例。该类型实现了IEnumerable<T>
接口。在枚举可枚举对象之前,迭代器方法中的代码实际上不会被调用。由于您没有枚举Get2
调用的结果,因此永远不会调用您的代码。要强制使用,请使用ToArray()
或ToList()
:
d.Get2().ToList();
答案 1 :(得分:0)
方法Get2()中的代码只有在迭代方法返回的IEnumerable时才会执行。 由于在这种情况下IEnumerable包含两个元素,它将输入此代码两次 - 在第一次迭代期间,它将执行前两行并退出函数“yield return 1; 在下一次迭代期间,它将进入该函数并在“Console.WriteLine(”Getting 2“)行开始执行;”并继续从那里开始。
因此,如果您不迭代这两个项目,即在获取值1之后,您不会移动到IEnumerable中的下一个项目,则不会再次输入该函数。 尝试将程序更改为以下代码以便更好地理解。
static void Main(string[] args)
{
using (DispClass d = new DispClass())
{
var lst = d.Get2();
//d.Get1();
foreach (var a in lst)
{
break;
}
}
Console.ReadKey();
}