使用IDisposable实例的yield返回IEnumerable <t>

时间:2016-10-05 16:06:54

标签: c# idisposable yield

我发现了一件有趣的事情。 c#,。NET 4.0。 我有一个代表IDisposable接口的类。在上面提到的类中我有一个函数,返回IEnumerable并返回yield。 在调用时,controll跳过该函数。不要介入。 例如:

&out_len

输出: “构造” “得到一个” “处置”

“获得1”,“获得2”在哪里? 如果没有收益率返回并返回本地列表,我可以看到这些......

请解释一下!

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();
    }