gpt4 book ai didi

c# - 在闭包中捕获 TextReader 但仍然正确处理它的好方法是什么?

转载 作者:行者123 更新时间:2023-11-30 15:03:25 26 4
gpt4 key购买 nike

这是一个简化的示例,用于隔离问题的目的。在我的实际场景中,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?

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

最佳答案

如果您不需要 lambda 表达式,您可以创建可枚举的。

可能在 =>{} 内部移动 using 可能会在实际代码中工作...仍然可能不是您要找的东西:

static ColumnReader GetColumnReader(string filename) {
return () => {
using (TextReader reader = new StreamReader(filename)) {
var headers = reader.ReadLine();
return reader.ReadLine();
}
};
}

带有 IEnumerable 的版本(如果你总是完成迭代):

 static IEnumerable<string> GetColumnReader(string filename) {
using (TextReader reader = new StreamReader("aa")) {
var headers = reader.ReadLine();
yield return reader.ReadLine();
}
}

如果您想支持枚举中间的迭代,则需要创建自定义 IDisposable 迭代器。看看如何foreach handles iterators that implement IDisposable处理此类情况。

关于c# - 在闭包中捕获 TextReader 但仍然正确处理它的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11571049/

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