Почему использование лучше, чем использование?

В соответствии с последним предложением эта страница MSDN use должна быть предпочтительнее using. Я слышал это в другом месте (этот ответ, например). Почему это? Я понимаю, что use был добавлен позже. Но какая разница? На поверхности using кажется более полезным, потому что вы можете контролировать, когда вызывается Dispose(), и вы можете явно игнорировать связанное значение (например, (fun _ -> ...)) при необходимости.

Ответы

Ответ 1

Я думаю, что причина для предпочтения use заключается только в том, что синтаксис проще. Многие другие языковые конструкции могут быть выражены как функции (например, try .. with, for, while,...). Если разработчики языка добавили более простой синтаксис, почему бы не использовать его...

Как я уже писал в более раннем ответе, на который вы ссылаетесь, вы можете точно управлять областью даже при использовании use. (И таким образом вы можете использовать его даже в конструкторах выражений классов object.) Но большую часть времени автоматическое поведение просто отлично (что делает конструкцию проще, чем using в С#).

Будете ли вы использовать use или using в ситуациях, когда вам нужно явно контролировать область, это вопрос личного вкуса. Если вам не нравится явное определение области use (что выглядит немного странно, я признаю, но отлично работает для меня), вы можете использовать using.

EDIT: В объявлении класса вы не можете, например, написать:

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

поскольку область a будет (возможно) всей продолжительностью жизни экземпляра. (Хотя я думаю, что это может быть полезно, и это может добавить автоматическую реализацию IDisposable к вашему типу). Если вы используете using, вы не получите такую ​​проблему.

Ответ 2

Вы можете управлять, когда dispose вызывается с помощью use, а также с помощью обычных контуров обзора (например, parens или 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% времени делает то, что вам нужно, поэтому я думаю, что он предпочтет.

Ответ 3

Лично я предпочитаю use - using по той же причине, что предпочитаю

let a = some_expr
some_stuff_with_a

к

(fun a -> some_stuff_with_a) some_expr

В форме привязки вы обычно можете избежать набора круглых скобок, и связь между идентификатором и значением, с которым он привязан, ближе и легче видеть.

Ответ 4

Пример с use лучше, чем using:

using лучше, чем use, поскольку using может быть записано в одну строку, а use не может.

Пример,
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