匯入宣告:open 關鍵字

「匯入宣告」可指定模組或命名空間,您無須使用完整名稱即可參考其中的元素。

語法

open module-or-namespace-name
open type type-name

備註

若每次都使用完整命名空間或模組路徑來參考程式碼,建立的程式碼可能會難以寫入、讀取及維護。 您可以改為針對常用的模組和命名空間使用 open 關鍵字,如此當您參考該模組或命名空間的成員時,即可使用簡短形式的名稱,而不用使用完整名稱。 此關鍵字類似 C# 中的 using 關鍵字、Visual C++ 中的 using namespace,以及 Visual Basic 中的 Imports

提供的模組或命名空間必須位於相同的專案中,或位於參考的專案或組件中。 如果不是,您可以將參考新增至專案,或使用 -reference 命令列選項 (或其縮寫 -r)。 如需詳細資訊,請參閱編譯器選項

匯入宣告可讓遵循宣告的程式碼使用名稱,程式碼範圍一直到內含命名空間、模組或檔案的結尾。

使用多個匯入宣告時,這些宣告應該會出現在不同行。

下列程式碼示範了如何使用 open 關鍵字簡化程式碼。

// Without the import declaration, you must include the full
// path to .NET Framework namespaces such as System.IO.
let writeToFile1 filename (text: string) =
  let stream1 = new System.IO.FileStream(filename, System.IO.FileMode.Create)
  let writer = new System.IO.StreamWriter(stream1)
  writer.WriteLine(text)

// Open a .NET Framework namespace.
open System.IO

// Now you do not have to include the full paths.
let writeToFile2 filename (text: string) =
  let stream1 = new FileStream(filename, FileMode.Create)
  let writer = new StreamWriter(stream1)
  writer.WriteLine(text)

writeToFile2 "file1.txt" "Testing..."

當多個開放模組或命名空間出現相同名稱而造成語意模糊時,F# 編譯器不會發出錯誤或警告。 發生語意模糊的情況時,F# 會優先使用最近開啟的模組或命名空間。 例如,在下列程式碼中,empty 代表 Seq.empty,即便 empty 同時位於 ListSeq 模組中也是如此。

open List
open Seq
printfn %"{empty}"

因此,當您開啟的模組或命名空間 (例如 ListSeq) 包含具有相同名稱的成員時,請務必小心;請考慮改為使用完整名稱。 您應避免任何程式碼相依於匯入宣告順序的情況。

開放式類型宣告

F# 在類型支援 open,如下所示:

open type System.Math
PI

這會公開該類型所有可存取的靜態欄位和成員。

您也可以 open F# 定義的 記錄差別聯合類型來公開靜態成員。 若是差別聯合,您也可以公開聯合案例。 當存取類型中的聯合案例,而該類型的宣告位置在您可能不想開啟的模組內時,這樣做就很實用,如下所示:

module M =
    type DU = A | B | C

    let someOtherFunction x = x + 1

// Open only the type inside the module
open type M.DU

printfn "%A" A

預設開啟的命名空間

有些命名空間在 F# 程式碼中經常使用,因此會隱含地開啟,無須明確的匯入宣告。 下表說明了預設開啟的命名空間。

Namespace 描述
FSharp.Core 包含內建類型 的基本 F# 類型定義,例如 intfloat
FSharp.Core.Operators 包含基本算術運算,例如 +*
FSharp.Collections 包含不可變的集合類別,例如 ListArray
FSharp.Control 包含用於控制建構的類型,例如延遲評估和非同步運算式。
FSharp.Text 包含適用於已格式化 IO 的函式,例如 printf 函式。

AutoOpen 屬性

若您想在參考組件時自動開啟命名空間或模組,可以將 AutoOpen 屬性套用至組件。 您也可以將 AutoOpen 屬性套用至模組,以在開啟父代模組或命名空間時自動開啟該模組。 如需詳細資訊,請參閱 AutoOpenAttribute (英文)。

RequireQualifiedAccess 屬性

部分模組、記錄或聯合的類型可指定 RequireQualifiedAccess 屬性。 當您參考這類模組、記錄或聯合時,無論是否加入匯入宣告,都必須使用限定名稱。 若您對定義常用名稱的類型策略性地使用此屬性,可避免名稱衝突,從而讓程式碼在面對程式庫變更時更具彈性。 如需詳細資訊,請參閱 RequireQualifiedAccessAttribute (英文)。

另請參閱