gpt4 book ai didi

c# - 枚举产生方法时可能不会调用 finally block

转载 作者:太空狗 更新时间:2023-10-29 21:44:57 24 4
gpt4 key购买 nike

<分区>

我发现了一个没有调用 finally block 的情况。

重点:

using System;
using System.Collections.Generic;
using System.Threading;
using System.ComponentModel;

class MainClass{
static IEnumerable<int> SomeYieldingMethod(){
try{
yield return 1;
yield return 2;
yield return 3;
}finally{
Console.WriteLine("Finally block!");
}
}

static void Main(){
Example(7);
Example(2);
Example(3);
Example(4);
}

static void Example(int iterations){
Console.WriteLine("\n Example with {0} iterations.", iterations);
var e = SomeYieldingMethod().GetEnumerator();
for (int i = 0; i< iterations; ++i) {
Console.WriteLine(e.Current);
e.MoveNext();
}
}
}

结果:

Example with 7 iterations.
0
1
2
3
Finally block!
3
3
3

Example with 2 iterations.
0
1

Example with 3 iterations.
0
1
2

Example with 4 iterations.
0
1
2
3
Finally block!

因此,看起来如果有人正在使用我的 yielding 方法并使用枚举器(而不是 foreach)手动处理它,那么我的 finally block 将永远无法被调用。

有什么方法可以确保我的方法最终确定它的资源吗?这是“yield syntactic sugar”中的错误,还是它按预期工作?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com