とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

自動でdisposeを呼ぶusing

PowerShell 4.0 には IDisposable の Dispose を自動で呼ぶ仕組みが無いようです。無いならばどうにかしなければなりません。そこで、useという関数を作りました。

usingという識別子を使おうとするとエラーになるので、useという関数名にしています。ドキュメントのどこにも見当たらないのですが、usingがキーワードとみなされているようです。

function use([IDisposable]$disposable, [ScriptBlock]$block){
    try{
        &$block($disposable)
    }finally{
        if($disposable){ $disposable.Dispose() }
    }
}

以下のように使います。

use (New-Object IO.FileStream('in.txt', [IO.Filemode]::Open)){
    param($in)
    use (New-Object IO.FileStream('out.txt', [IO.FileMode]::Create)){
        param($out)
        $in.CopyTo($out)
    }
}

IDisposable のオブジェクトはスクリプトブロックの引数として渡されます。Disposeは勝手に呼ばれるので、スクリプトブロック内では好きなようにしてOK.

こういうのは基本的なパーツだと思うのですが、言語機能として無いのも不思議ですし、「言語に無いならどうにかしなきゃ」みたいな記事を日本語圏で見かけないのも不思議です。