Объявления импорта: open ключевое слово

Объявление импорта указывает модуль или пространство имен, элементы которого можно ссылаться без использования полного имени.

Синтаксис

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# предоставляет предпочтение недавно открытому модулю или пространству имен. Например, в следующем коде означаетSeq.empty, что даже если empty он расположен как в модулях, empty так и Seq в List обоих модулях.

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

Пространства имен, открытые по умолчанию

Некоторые пространства имен так часто используются в коде F#, что они открываются неявно без необходимости явного объявления импорта. В следующей таблице показаны пространства имен, открытые по умолчанию.

Пространство имен Description
FSharp.Core Содержит основные определения типов F# для встроенных типов, таких как int и float.
FSharp.Core.Operators Содержит основные арифметические операции, такие как + и *.
FSharp.Collections Содержит неизменяемые классы коллекции, такие как List и Array.
FSharp.Control Содержит типы для конструкций элементов управления, таких как отложенная оценка и асинхронные выражения.
FSharp.Text Содержит функции для отформатированного ввода-вывода, например printf функции.

Атрибут AutoOpen

Атрибут можно применить AutoOpen к сборке, если вы хотите автоматически открыть пространство имен или модуль при ссылке на сборку. Вы также можете применить AutoOpen атрибут к модулю, чтобы автоматически открыть этот модуль при открытии родительского модуля или пространства имен. Дополнительные сведения см. в разделе AutoOpenAttribute.

Атрибут RequireQualifiedAccess

Некоторые модули, записи или типы объединения могут указывать RequireQualifiedAccess атрибут. При ссылке на элементы этих модулей, записей или профсоюзов необходимо использовать полное имя независимо от того, включается ли объявление импорта. Если этот атрибут стратегически используется для типов, определяющих часто используемые имена, вы помогаете избежать конфликтов имен и тем самым сделать код более устойчивым к изменениям в библиотеках. Дополнительные сведения см. в разделе RequireQualifiedAccessAttribute.

См. также