共用方式為


資源管理:use 關鍵字

本主題描述索引鍵 useusing 函式,可控制資源的初始化和發行。

資源

資源一詞有多個用法。 是,資源可為應用程式使用的資料,例如字串、圖形等,但在此內容中,資源是指軟體或作業系統資源,例如圖形裝置內容、檔案控制代碼、網路和資料庫連線、並行物件 (例如等候控制碼) 等等。 應用程式使用這些資源牽涉到從作業系統或其他資源提供者取得資源,隨後將資源發行至集區,以便提供給另一個應用程式。 當應用程式未將資源發行回一般集區時,就會發生問題。

管理資源

若要有效率且負責任地管理應用程式中的資源,您必須以可預測的方式立即發行資源。 .NET 架構可提供 System.IDisposable 介面來協助您執行這項操作。 實作 System.IDisposable 的類型具有 System.IDisposable.Dispose 方法,可正確釋放資源。 撰寫良好的應用程式保證當不再需要保留有限資源的任何物件時,會立即呼叫 System.IDisposable.Dispose。 幸好,大部分 .NET 語言都提供支援,使這項操作更輕鬆,而 F# 也不例外。 有兩種有用的語言建構可支援處置模式:use 繫結和 using 函式。

使用繫結

use 索引鍵具有類似 let 繫結的格式:

使用 value = expression

其提供與 let 繫結相同的功能,但會在值超出範圍時,在值上新增對 Dispose 的呼叫。 請注意,編譯器會在值上插入 Null 檢查,因此,如果值為 null,則不會嘗試呼叫 Dispose

下列範例示範如何使用 use 索引鍵自動關閉檔案。

open System.IO

let writetofile filename obj =
   use file1 = File.CreateText(filename)
   file1.WriteLine("{0}", obj.ToString() )
   // file1.Dispose() is called implicitly here.

writetofile "abc.txt" "Humpty Dumpty sat on a wall."

use 的多個執行個體會依照宣告它們的相反順序進行處理。 也就是說,第一個 use 將是最後一個發行的。

注意

您可以在計算運算式中使用 use,在此情況下,會使用自訂版本的 use 運算式。 如需詳細資訊,請參閱序列非同步運算式工作運算式計算運算式

using 函式

using 函式的格式如下:

using (expression1) function-or-lambda

using 運算式中,expression1 會建立必須處置的物件。 expression1 (必須處置的物件) 的結果會變成引數 (value) 為 function-or-lambda,也就是預期類型的單一剩餘引數符合 expression1 所產生值的函式,或是預期該類型引數的 Lambda 運算式。 在函式執行結束時,執行階段會呼叫 Dispose 並釋放資源 (除非值為 null,在此情況下,不會嘗試呼叫 Dispose)。

下列範例示範具有 Lambda 運算式的 using 運算式。

open System.IO

let writetofile2 filename obj =
    using (System.IO.File.CreateText(filename)) ( fun file1 ->
        file1.WriteLine("{0}", obj.ToString() )
    )

writetofile2 "abc2.txt" "The quick sly fox jumps over the lazy brown dog."

下一個範例顯示具有函式的 using 運算式。

let printToFile (file1 : System.IO.StreamWriter) =
    file1.WriteLine("Test output");

using (System.IO.File.CreateText("test.txt")) printToFile

請注意,函式可能是已套用某些引數的函式。 下列程式碼範例示範此工作。 其會建立包含 XYZ 字串的檔案。

let printToFile2 obj (file1 : System.IO.StreamWriter) =
    file1.WriteLine(obj.ToString())

using (System.IO.File.CreateText("test.txt")) (printToFile2 "XYZ")

using 函式和 use 繫結幾乎等同於完成相同動作的方式。 using 索引鍵可在呼叫 Dispose 時提供更多控制權。 當您使用 using 時,會在函式或 Lambda 運算式結尾呼叫 Dispose;當您使用 use 索引鍵時,會在包含程式碼區塊的結尾呼叫 Dispose。 一般而言,您應該偏好使用 use 而非 using 函式。

另請參閱