Почему использовать лучше, чем использовать? - PullRequest
18 голосов
/ 19 февраля 2011

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

Ответы [ 4 ]

20 голосов
/ 19 февраля 2011

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

15 голосов
/ 19 февраля 2011

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

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

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

РЕДАКТИРОВАТЬ: В объявлении класса, например, вы не можете написать:

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

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

3 голосов
/ 19 февраля 2011

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

let a = some_expr
some_stuff_with_a

(fun a -> some_stuff_with_a) some_expr

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

0 голосов
/ 20 октября 2013

Пример против 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
...