これは、質問の目的を分離するための簡略化された例です。私の実際のシナリオでは、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が最終的に閉じられるという保証はありません。
返されたラムダ関数に「デストラクタ」を追加する方法はありますか?ラムダ関数がスコープから外れると(参照がなくなると)すぐにTextReaderを破棄できる可能性がありますか?
他の提案も歓迎しますが、基本的なクロージャー構造を維持したいと思います(つまり、質問の範囲に収まります)。