18

このMSDNページ の最後の文によると、useよりも優先されusingます。私は他の場所でそれを聞いたことがあります(たとえば、この答え)。どうしてこれなの?後で追加されたことに気づきuseました。しかし、違いは何ですか?表面的には、が呼び出されるタイミングを制御でき、必要に応じてバインドされた値(たとえば)を明示的に無視できるusingため、より便利なようです。Dispose()(fun _ -> ...)

4

4 に答える 4

21

通常のスコーピング構文 (括弧や-など)useを使用するだけで、dispose がいつ呼び出されるかを制御することもできます。beginend

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% の確率で必要なことを実行できるため、この方法が好まれるのだと思います。

于 2011-02-18T21:20:00.030 に答える
15

use好む理由は、構文が単純だからだと思います。他の多くの言語構造は、関数として表現できます (例: try .. withforwhile...)。言語設計者がより単純な構文を追加した場合、それを使用してみませんか...

参考にした以前の回答にも書いた通り、 を使っていてもスコープを細かく制御できますuse(このようにして、オブジェクト式のクラス宣言のコンストラクターでも使用できます。) しかし、ほとんどの場合、自動動作は問題ありません (これにより、 usingC#よりも構成が単純になります)。

スコープを明示的に制御する必要がある状況で使用するかどうかは、個人的な好みの問題useです。usingの明示的なスコープが気に入らない場合use(少し奇妙に見えますが、私には問題なく動作します)、 を使用できますusing

編集:クラス宣言では、たとえば次のように書くことはできません:

type Foo() =
  use a = new Whatever()
  // ...

のスコープはa(おそらく) インスタンスの存続期間全体になるためです。(ただし、これは便利で、タイプに の自動実装を追加できると思いIDisposableます)。を使えばusing、このようなトラブルはありません。

于 2011-02-18T21:21:59.777 に答える
3

個人的には、私が好むuseusingと同じ理由で

let a = some_expr
some_stuff_with_a

(fun a -> some_stuff_with_a) some_expr

バインディング フォームを使用すると、通常、一連の括弧を回避できます。また、識別子とそれがバインドされている値との間の関連付けは、スペース内でより近くなり、見やすくなります。

于 2011-02-19T00:13:55.950 に答える
0

反対の例useは、次の場合に適していますusing

using1行で書けるよりは良いがuse、書けない。usinguse

例として、与えられた parameter を使用して
xx開かれたリソースから関数 fct によって値を返す関数があります。yyp

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
于 2013-10-20T11:56:20.383 に答える