这是一个简化的示例,用于隔离问题的目的。在我的实际场景中,GetColumnReader 返回的 ColumnReader 实际上会比仅仅 ReadLine 做更多的工作。
如果我运行下面的程序,当我尝试调用 Reader() 时会出错,因为 TextReader 已经被 using 语句处理掉了。
public class Play{
delegate string ColumnReader();
static ColumnReader GetColumnReader(string filename){
using (TextReader reader = new StreamReader(filename)){
var headers = reader.ReadLine();
return () => reader.ReadLine();
}
}
public static void Main(string[] args){
var Reader = GetColumnReader("Input.tsv");
Console.WriteLine(Reader());
}
}
或者,我可以删除“使用”并直接声明 TextReader,它会起作用,但现在我们不再保证 TextReader 最终会被关闭。
有没有办法在返回的 lambda 函数中添加“析构函数”,一旦 lambda 函数超出范围(不再引用),我就可以在其中处理 TextReader?
我也欢迎其他建议,但希望保留基本的闭包结构(即适合问题的范围)。