Объявления импорта: 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
Открытие из корневого пути только с 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#, что они открываются неявно без необходимости явного объявления импорта. В следующей таблице показаны пространства имен, открытые по умолчанию.
Пространство имен | 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.