这是一个简化的示例,以隔离问题的目的。在我实际的场景中,由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());
    }


}


另外,我可以删除“ using”并直接声明TextReader,它将起作用,但是现在我们不再保证TextReader最终将被关闭。

有没有一种方法可以在返回的lambda函数中添加“析构函数”,使lambda函数超出范围(不再有引用)时,我可以立即处置TextReader?

我也欢迎其他建议,但希望保留基本的封闭结构(即适合问题的范围)。

最佳答案

本质上,您需要委托人本身之外的一次性元素的范围。在这些情况下,我将使委托接受一次性实例(即TextReader)而不是文件名。

09-25 21:42