本主題描述 關鍵詞 use 和 using 函式,可控制資源的初始化和發行。
資源
資源一詞會以一種以上的方式使用。 是,資源可以是應用程式使用的數據,例如字串、圖形等,但在此內容中, 資源 是指軟體或作系統資源,例如圖形裝置內容、檔句柄、網路和資料庫連線、並行物件,例如等候句柄等等。 應用程式使用這些資源牽涉到從作系統或其他資源提供者取得資源,之後再將資源發行至集區,以便提供給另一個應用程式。 當應用程式不會將資源釋放回一般集區時,就會發生問題。
管理資源
若要有效率且負責任地管理應用程式中的資源,您必須以可預測的方式及時釋放資源。 .NET Framework 可藉由提供 System.IDisposable 介面來協助您執行這項作。 實作 System.IDisposable 的類型具有 System.IDisposable.Dispose 方法,可正確釋放資源。 撰寫良好的應用程式保證 System.IDisposable.Dispose ,當不再需要保留有限資源的任何物件時,會立即呼叫。 幸運的是,大部分的 .NET 語言都提供支援,讓這更容易,F# 也不例外。 有兩種實用的語言建構支持處置模式:系 use 結和函 using 式。
use Binding
use關鍵字具有類似系結的let表單:
use 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 個將是最後一個發行的。
using 函式
函 using 式的格式如下:
using (expression1) function-or-lambda
在表達式中 using , expression1 會建立必須處置的物件。
expression1 的結果(必須處置的物件)會變成 function-or-lambda 的自變數、值、函式或 Lambda,該函式是預期類型之單一剩餘自變數符合 expression1 所產生的值,或是預期該型別自變數的 Lambda 表達式。 在函式執行結束時,運行時間會呼叫 Dispose 並釋放資源(除非值為 null,在此情況下不會嘗試呼叫 Dispose)。
下列範例示範 using 具有 Lambda 表達式的運算式。
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時, Dispose 會在函式或 Lambda 表示式的結尾呼叫 ;當您使用 use 關鍵詞時, Dispose 會在包含程式碼區塊的結尾呼叫 。 一般而言,您應該偏好使用 use 而非函 using 式。