根據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. 爲什麼使用str()比__str更好__()
- 2. 在什麼情況下使用json_encode()比使用serialize()更好?
- 3. 爲什麼依賴注入比使用工廠更好?
- 4. 爲什麼Java'Comparable'比只使用compareTo方法更好?
- 5. 爲什麼在C++中使用「vector.at(x)」比「vector [x]」更好?
- 6. 爲什麼file_get_contents()比使用fsock_open()更快?
- 7. Javascript:使用jquery的bind()比使用onclick ='bla()'更好的爲什麼?
- 8. 什麼使得JIRA比Redmine更好
- 9. 使用ObjectReader比ObjectMapper有什麼好處?
- 10. 爲什麼使用NEWID()使用比NEWSEQUENTIALID()更多的空間?
- 11. 爲什麼NoSQL比使用Node.js的RDBMS更多使用?
- 12. 有什麼更好的使用,爲什麼?
- 13. 爲什麼requestAnimationFrame比setInterval或setTimeout更好
- 14. 爲什麼mysql count(*)比count更好(id)
- 15. 爲什麼FileChannel比MemoryMappedBuffer表現更好?
- 16. 爲什麼str.format()比str()更好?
- 17. Excel VBA:爲什麼API比SendKeys更好?
- 18. 爲什麼ArrayDeque比LinkedList更好
- 19. 爲什麼boost :: any比void *更好?
- 20. 爲什麼poll()比select()更好?
- 21. 什麼時候使用C++ iostreams比ReadFile,WriteFile,fprintf等更好?
- 22. 爲什麼要使用websocket,使用它有什麼好處?
- 23. 什麼比PHP Glob更好?
- 24. 什麼比邊框更好?
- 25. 使用ZF2會話比使用PHP有什麼好處$ _SESSION
- 26. 使用郵遞員寶石比使用ActionMailer有什麼好處?
- 27. 有什麼更好的使用? (px或%)
- 28. 什麼時候不使用RelativeLayout更好?
- 29. 爲什麼使用「is」運算符比較True/False不好?
- 30. 爲什麼我應該使用LINQ to SQL當ADO.NET比這更好的工作
這個語法的古怪看起來似乎是另一個贊成「使用」的理由。你知道他們是否產生不同的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