a wandering wolf

Does a wandering wolf dreams of a wondering, sometimes programming sheep?

このエントリーをはてなブックマークに追加

C# での Using 関数

C# でファイルなどのリソースを上手く管理するには、皆さんもちろん using 句(VB であれば Using 句ですね)を使うことだろうと思います:

using (var sr = new System.IO.StreamReader("hoge.txt"))
{
    // StreamReaderインスタンスを使って何かする
    DoSomethingWith(sr);
}

同じ.NET言語で、F# でも同じようなことが出来て、例えば use 束縛があります:

use sr = new System.IO.StreamReader("hoge.txt")
// StreamReaderインスタンスを使って何かする
DoSomethingWith sr

一方、F# では using 関数というのもあって、こちらも同じような用途に使うことが出来ます:

using (System.IO.StreamReader("hoge.txt")) DoSomethingWith

ほとんどの C# ユーザーは現状で問題ないと思いますが、ごく一部の C#er (私を含む)には欲しい機能かもしれません。

書いてみた

こんな感じです:

public static Func<Func<T, TResult>, TResult> Using<T, TResult>(T expression) where T : IDisposable
{
    return new Func<Func<T, TResult>, TResult>(f =>
    {
        using (expression)
        {
            return f(expression);
        }
    });
}

こんな風に使います:

var result = Using(new System.IO.StreamReader("hoge.txt"))(sr => DoSomethingWith(sr));

最後に

餅は餅屋だと思います。