共用方式為


資源管理:use 關鍵字 (F#)

本主題描述可控制資源初始設定及釋放的關鍵字 use 和 using 函式。

資源

「資源」(Resource) 一詞有多種用法。資源可以是應用程式所使用的資料,例如字串、圖形等等,但在此內容中,「資源」(Resource) 是指軟體或作業系統資源,例如圖形裝置內容、檔案控制代碼、網路和資料庫連接、如等候控制代碼之類的並行物件等等。應用程式使用這些資源時,會從作業系統或其他資源提供者取得資源,接著將資源釋放至集區,以供另一個應用程式使用。當應用程式未將資源釋放回通用集區時,會發生問題。

管理資源

若要有效率、負責任地管理應用程式中的資源,您必須以立即、可預測的方式釋放資源。.NET Framework 提供 IDisposable 介面,協助您完成此作法。實作 IDisposable 的型別有 Dispose 方法,此方法會正確釋放資源。當不再需要持有有限資源的任何物件時,編寫完善的應用程式保證會立即呼叫 Dispose。幸運的是,大部分 .NET 語言都有提供支援,讓這一切更輕鬆,F# 也不例外。有兩個有用的語言建構支援處置模式:use 繫結和 using 函式。

use 繫結

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 版本的運算式。如需詳細資訊,請參閱 序列 (F#)非同步工作流程 (F#)計算運算式 (F#)

using 函式

using 函式的形式如下:

using (expression1) function-or-lambda

在 using 運算式中,expression1 會建立必須被處置的物件。expression1 的結果 (必須被處置的物件) 會成為 function-or-lambda (可能是需要符合 expression1 所產生值之型別的單一剩餘引數的函式,或是需要該型別之引數的 Lambda 運算式) 的引數 value。執行函式之後,執行階段會呼叫 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 jumped 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 函式。

請參閱

參考

IDisposable

其他資源

F# 語言參考