匯入宣告: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
同時位於 List
和 Seq
模組中也是如此。
open List
open Seq
printfn %"{empty}"
因此,當您開啟的模組或命名空間 (例如 List
或 Seq
) 包含具有相同名稱的成員時,請務必小心;請考慮改為使用完整名稱。 您應避免任何程式碼相依於匯入宣告順序的情況。
開放式類型宣告
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
僅使用 global
指定名稱從根路徑開啟
巢狀模組,例如
module A =
module B =
...
可透過以下途徑開啟
open A // opens A
open B // opens A.B
若只要開啟完整模組或命名空間,請在其前面加上 global
指定名稱:
open global.A // works
open global.B // this now fails
open global.A.B // works
預設開啟的命名空間
有些命名空間在 F# 程式碼中經常使用,因此會隱含地開啟,無須明確的匯入宣告。 下表說明了預設開啟的命名空間。
Namespace | 描述 |
---|---|
FSharp.Core |
包含內建類型 的基本 F# 類型定義,例如 int 和 float 。 |
FSharp.Core.Operators |
包含基本算術運算,例如 + 和 * 。 |
FSharp.Collections |
包含不可變的集合類別,例如 List 和 Array 。 |
FSharp.Control |
包含用於控制建構的類型,例如延遲評估和非同步運算式。 |
FSharp.Text |
包含適用於已格式化 IO 的函式,例如 printf 函式。 |
AutoOpen 屬性
若您想在參考組件時自動開啟命名空間或模組,可以將 AutoOpen
屬性套用至組件。 您也可以將 AutoOpen
屬性套用至模組,以在開啟父代模組或命名空間時自動開啟該模組。 如需詳細資訊,請參閱 AutoOpenAttribute (英文)。
RequireQualifiedAccess 屬性
部分模組、記錄或聯合的類型可指定 RequireQualifiedAccess
屬性。 當您參考這類模組、記錄或聯合時,無論是否加入匯入宣告,都必須使用限定名稱。 若您對定義常用名稱的類型策略性地使用此屬性,可避免名稱衝突,從而讓程式碼在面對程式庫變更時更具彈性。 如需詳細資訊,請參閱 RequireQualifiedAccessAttribute (英文)。