我发现未调用 finally 块的情况。
重点:
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 块永远不会被调用。
有什么办法可以确保我的方法最终确定它的资源?这是“产生语法糖”中的一个错误,还是它按预期工作?