匯入宣告:open 關鍵字 (F#)
「匯入宣告」(Import Declaration) 可指定在不使用完整限定名稱的情形下,參考其項目的模組或命名空間。
open module-or-namespace-name
備註
每次參考程式碼時都使用完整限定命名空間或模組路徑,會讓程式碼難以撰寫、閱讀及維護。 您可以對常用的模組和命名空間改用 open 關鍵字,如此在參考該模組或命名空間的成員時,可以使用簡短名稱形式,而不是完整限定名稱。 這個關鍵字類似 C# 中的 using 關鍵字、Visual C++ 中的 using namespace,以及 Visual Basic 中的 Imports。
所提供的模組或命名空間必須是在相同的專案中,或是在參考的專案或組件中。 如果不是,您可以將參考加入專案中,或使用 -reference 命令列選項 (或其縮寫 -r)。- 如需詳細資訊,請參閱編譯器選項 (F#)。
匯入宣告能讓名稱可用於宣告後面的程式碼,一直到封入命名空間、模組或檔案結尾為止。
當您使用多個匯入宣告時,應該將它們放在不同行。
下列程式碼會示範如何使用 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 同時位於 List 和 Seq 模組中,但是 empty 表示 Seq.empty。
open List
open Seq
printfn "%A" empty
因此,當您開啟包含同名成員的模組或命名空間 (例如 List 或 Seq) 時,請務必小心謹慎,或者考慮改用限定名稱。 撰寫程式碼時,要避免相依於匯入宣告順序的情況。
預設開啟的命名空間
F# 程式碼中有些命名空間因為常用會隱含開啟,而不需要明確匯入宣告。 下表列出預設開啟的命名空間。
命名空間 |
描述 |
---|---|
Microsoft.FSharp.Core |
包含內建型別 (例如 int 和 float) 的基本 F# 型別定義。 |
Microsoft.FSharp.Core.Operators |
包含基本算術運算,例如 + 和 *。 |
Microsoft.FSharp.Collections |
包含不可變集合類別,例如 List 和 Array。 |
Microsoft.FSharp.Control |
包含控制項建構 (例如,延遲評估和非同步工作流程) 的型別。 |
Microsoft.FSharp.Text |
包含格式化之 IO 的函式,例如 printf 函式。 |
AutoOpen 屬性
如果您要在參考組件時自動開啟命名空間或模組,可以將 AutoOpen 屬性套用至該組件。 您也可以將 AutoOpen 屬性套用至模組,以便在開啟父模組或命名空間時自動開啟該模組。 如需詳細資訊,請參閱 Core.AutoOpenAttribute 類別 (F#)。
RequireQualifiedAccess 屬性
某些模組、 記錄或等位型別可以指定 RequireQualifiedAccess 屬性。 當您參考這類模組、 記錄或等位的項目時,您必須使用限定的名稱,而不管您將包含的匯入宣告。 當您使用這個屬性策略性的型別會定義最常使用的名稱,,你幫助避免名稱衝突,並藉此讓程式碼更有彈性的程式庫中的變更。 如需詳細資訊,請參閱 Core.RequireQualifiedAccessAttribute 類別 (F#)。