根据this MSDN page的最后一句use
优于using
。我听说过其他地方(例如,this answer)。为什么是这样?我意识到use
稍后添加。但有什么区别?表面上看,using
似乎更有用,因为您可以控制何时调用Dispose()
,并且如果需要,您可以显式忽略绑定值(例如(fun _ -> ...)
)。为什么使用比使用更好?
15
A
回答
12
我认为宁愿use
的原因就是语法比较简单。许多其他语言结构可以表达为功能(例如try .. with
,for
,while
,...)。如果语言设计者添加了更简单的语法,为什么不使用它...
正如我在earlier answer you referenced中所写的,即使在使用use
时,也可以精确控制范围。 (这样,即使在
对象表达式
类声明的构造函数中,也可以使用它。)但是大多数情况下,自动行为都很好(这使得构造比C#中的using
简单)。
在需要明确控制范围的情况下,您是否会使用use
或using
是个人品味问题。如果你不喜欢use
的显式范围(这看起来有点奇怪,我承认,但对我来说工作正常),你可以使用using
。
编辑:类声明中,你不能例如写:
type Foo() =
use a = new Whatever()
// ...
因为a
范围是(可能)的实例的整个生命周期。 (虽然我认为这可能很有用,并且可以为您的类型添加IDisposable
的自动实现)。如果你使用using
,你不会遇到这种麻烦。
16
只要使用通常的范围构造(例如parens或begin
-end
),例如,您可以控制何时使用use
调用dispose。
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
与结合的形式,通常可以避开一对括号,和协会标识符与其绑定的值之间的距离更近,更易于查看。
0
针对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
相关问题
- 1. 在什么情况下使用json_encode()比使用serialize()更好?
- 2. 为什么依赖注入比使用工厂更好?
- 3. 为什么file_get_contents()比使用fsock_open()更快?
- 4. Javascript:使用jquery的bind()比使用onclick ='bla()'更好的为什么?
- 5. 什么使得JIRA比Redmine更好
- 6. 使用ObjectReader比ObjectMapper有什么好处?
- 7. 什么时候使用C++ iostreams比ReadFile,WriteFile,fprintf等更好?
- 8. 为什么str.format()比str()更好?
- 9. 为什么boost :: any比void *更好?
- 10. 为什么mysql count(*)比count更好(id)
- 11. 为什么ArrayDeque比LinkedList更好
- 12. 为什么FileChannel比MemoryMappedBuffer表现更好?
- 13. 为什么requestAnimationFrame比setInterval或setTimeout更好
- 14. 为什么要使用websocket,使用它有什么好处?
- 15. 什么比边框更好?
- 16. 使用邮递员宝石比使用ActionMailer有什么好处?
- 17. 什么时候不使用RelativeLayout更好?
- 18. 为什么使用“is”运算符比较True/False不好?
- 19. 与我的例子相比,为什么使用授权库会更好?
- 20. 为什么我应该使用LINQ to SQL当ADO.NET比这更好的工作
- 21. 为什么Flex应用程序比Flash更好?
- 22. 为什么ICommand比调用VM的代码更好?
- 23. 为JCE使用fips有什么好处?
- 24. 为什么最好使用filter_input()?
- 25. 为什么HTTP比HTTPS使用得多?
- 26. 为什么比使用临时表
- 27. 什么是扁平捆绑,为什么Rollup比Webpack更好?
- 28. 比使用ViewBag更好的方法
- 29. 使用Storyboard比动画UIViews更好吗?
- 30. 为什么在REST更好的情况下使用rest api? NoSQL
这个语法的古怪看起来似乎是另一个赞成“使用”的理由。你知道他们是否产生不同的IL? – Daniel 2011-02-18 21:25:47
我期望他们会产生类似的IL,但我不知道或不在乎。至于语法怪异性,再次,没有人像这样写代码,因为没有人关心`Dispose`在函数结束之前或者在函数结束时被称为两行。重要的情况极为罕见。只需使用`use`。 – Brian 2011-02-18 22:20:07
如果您需要正确测试释放的对象(锁定的文件可以再次写入),或者例如使用信号量,则`use`范围结束后需要您编写内容的一种情况是。不过,只需在一个函数中封装`use`并在调用该函数后调用您的释放后代码就足够了,并且不需要在此示例中进行范围确定。 – Abel 2014-11-04 18:35:20