匯入宣告:
匯入宣告會指定模組或命名空間,您可以在不使用完整名稱的情況下參考其專案。
語法
open module-or-namespace-name
open type type-name
備註
每次都可以使用完整命名空間或模組路徑來參考程序代碼,以建立難以寫入、讀取和維護的程序代碼。 相反地,您可以針對經常使用的模組和命名空間使用 open 關鍵詞,以便在參考該模組或命名空間的成員時,可以使用名稱的簡短形式,而不是完整名稱。 這個關鍵詞類似於 using C# 中的 關鍵詞、 using namespace Visual C++ 和 Imports Visual Basic 中的 關鍵詞。
提供的模組或命名空間必須位於相同的專案或參考的專案或元件中。 如果不是,您可以加入項目的參考,或使用 -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即使 位於和 Seq 模組中List也一樣empty。
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。