2011-02-18 93 views
15

根據this MSDN page的最後一句use優於using。我聽說過其他地方(例如,this answer)。爲什麼是這樣?我意識到use稍後添加。但有什麼區別?表面上看,using似乎更有用,因爲您可以控制何時調用Dispose(),並且如果需要,您可以顯式忽略綁定值(例如(fun _ -> ...))。爲什麼使用比使用更好?

回答

12

我認爲寧願use的原因就是語法比較簡單。許多其他語言結構可以表達爲功能(例如try .. withfor,while,...)。如果語言設計者添加了更簡單的語法,爲什麼不使用它...

正如我在earlier answer you referenced中所寫的,即使在使用use時,也可以精確控制範圍。 (這樣,即使在 對象表達式 類聲明的構造函數中,也可以使用它。)但是大多數情況下,自動行爲都很好(這使得構造比C#中的using簡單)。

在需要明確控制範圍的情況下,您是否會使用useusing是個人品味問題。如果你不喜歡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%的時間能夠滿足您的需求,所以我認爲這就是爲什麼它是首選。

+2

這個語法的古怪看起來似乎是另一個贊成「使用」的理由。你知道他們是否產生不同的IL? – Daniel 2011-02-18 21:25:47

+0

我期望他們會產生類似的IL,但我不知道或不在乎。至於語法怪異性,再次,沒有人像這樣寫代碼,因爲沒有人關心`Dispose`在函數結束之前或者在函數結束時被稱爲兩行。重要的情況極爲罕見。只需使用`use`。 – Brian 2011-02-18 22:20:07

+0

如果您需要正確測試釋放的對象(鎖定的文件可以再次寫入),或者例如使用信號量,則`use`範圍結束後需要您編寫內容的一種情況是。不過,只需在一個函數中封裝`use`並在調用該函數後調用您的釋放後代碼就足夠了,並且不需要在此示例中進行範圍確定。 – Abel 2014-11-04 18:35:20

3

就個人而言,我更喜歡useusing出於同樣的原因,我喜歡

let a = some_expr 
some_stuff_with_a 

(fun a -> some_stuff_with_a) some_expr 

與結合的形式,通常可以避開一對括號,和協會標識符與其綁定的值之間的距離更近,更易於查看。

0

針對use一個實例是更好然後using

using優於useusing可以寫在一行而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 
相關問題