导入声明:open 关键字 (F#)

导入声明指定一个模块或命名空间,您无需使用完全限定名即可引用其中的元素。

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 表示 Seq.empty,即使 empty 位于 List 和 Seq 模块中也是如此。

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#)

请参见

参考

命名空间 (F#)

模块 (F#)

其他资源

F# 语言参考