Почему использование лучше, чем использование?
В соответствии с последним предложением эта страница 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