尝试......终于

如果迭代器方法在 try...finally 中有一个 yield,那么返回的 IEnumerator 将在 Dispose 被调用时执行 finally 语句,只要当前的评估点在 try 块内。

鉴于功能:

private IEnumerable<int> Numbers()
{
    yield return 1;
    try
    {
        yield return 2;
        yield return 3;
    }
    finally
    {
        Console.WriteLine("Finally executed");
    }
}

致电时:

private void DisposeOutsideTry()
{
    var enumerator = Numbers().GetEnumerator();

    enumerator.MoveNext();
    Console.WriteLine(enumerator.Current);
    enumerator.Dispose();
}

然后打印:

1

查看演示

致电时:

private void DisposeInsideTry()
{
    var enumerator = Numbers().GetEnumerator();

    enumerator.MoveNext();
    Console.WriteLine(enumerator.Current);
    enumerator.MoveNext();
    Console.WriteLine(enumerator.Current);
    enumerator.Dispose();
}

然后打印:

1
2
最后执行

查看演示