このMSDNページ の最後の文によると、use
よりも優先されusing
ます。私は他の場所でそれを聞いたことがあります(たとえば、この答え)。どうしてこれなの?後で追加されたことに気づきuse
ました。しかし、違いは何ですか?表面的には、が呼び出されるタイミングを制御でき、必要に応じてバインドされた値(たとえば)を明示的に無視できるusing
ため、より便利なようです。Dispose()
(fun _ -> ...)
4 に答える
通常のスコーピング構文 (括弧や-など)use
を使用するだけで、dispose がいつ呼び出されるかを制御することもできます。begin
end
let F() =
let x = 4
(
use file = System.IO.File.Open("foo.xml", System.IO.FileMode.Append)
let z = 4
printfn "file still open here"
)
printfn "file was already closed/disposed"
しかし、これが役立つことはめったにないと思います。オブジェクトに名前を付けたり使用したりしたくないこともまれだと思いIDisposable
ます。 use
の方が構文的に便利で、95% の確率で必要なことを実行できるため、この方法が好まれるのだと思います。
use
好む理由は、構文が単純だからだと思います。他の多くの言語構造は、関数として表現できます (例: try .. with
、for
、while
...)。言語設計者がより単純な構文を追加した場合、それを使用してみませんか...
参考にした以前の回答にも書いた通り、 を使っていてもスコープを細かく制御できますuse
。(このようにして、オブジェクト式のクラス宣言のコンストラクターでも使用できます。) しかし、ほとんどの場合、自動動作は問題ありません (これにより、 using
C#よりも構成が単純になります)。
スコープを明示的に制御する必要がある状況で使用するかどうかは、個人的な好みの問題use
です。using
の明示的なスコープが気に入らない場合use
(少し奇妙に見えますが、私には問題なく動作します)、 を使用できますusing
。
編集:クラス宣言では、たとえば次のように書くことはできません:
type Foo() =
use a = new Whatever()
// ...
のスコープはa
(おそらく) インスタンスの存続期間全体になるためです。(ただし、これは便利で、タイプに の自動実装を追加できると思いIDisposable
ます)。を使えばusing
、このようなトラブルはありません。
個人的には、私が好むuse
のusing
と同じ理由で
let a = some_expr
some_stuff_with_a
に
(fun a -> some_stuff_with_a) some_expr
バインディング フォームを使用すると、通常、一連の括弧を回避できます。また、識別子とそれがバインドされている値との間の関連付けは、スペース内でより近くなり、見やすくなります。
反対の例use
は、次の場合に適していますusing
。
using
1行で書けるよりは良いがuse
、書けない。using
use
例として、与えられた parameter を使用して
xx
開かれたリソースから関数 fct によって値を返す関数があります。yy
p
let xx p = using (yy(p)) (fun resource-> fct resource) // <-- this is OK
let xx p = (use resource = yy(p); fct resource) // <-- this is Not OK