Поделиться через


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

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

open module-or-namespace-name

Заметки

Использование полного имени пространства имен или пути модуля во всех ссылках на код может затруднить написание, чтение и поддержку кода.Вместо этого можно использовать ключевое слово open для наиболее часто используемых модулей и пространств имен, чтобы в ссылках на члены этих модулей и пространств имен можно было использовать их краткие имена вместо полных.Это ключевое слово аналогично словам using в C#, usingnamespace в Visual C++ и Imports в Visual Basic.

Указанный модуль или пространство имен должно находиться либо в том же проекте, либо в проекте или сборке, указанной ссылкой.В противном случае можно добавить ссылку на проект или использовать параметр командной строки -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

Содержит определения базовых типов F# для встроенных типов, таких как int и float.

Microsoft.FSharp.Core.Operators

Содержит базовые арифметические операции, такие как + и *.

Microsoft.FSharp.Collections

Содержит неизменяемые классы коллекций, таких как List и Array.

Microsoft.FSharp.Control

Содержит типы для конструкций управления, таких как отложенная оценка и асинхронные рабочие процессы.

Microsoft.FSharp.Text

Содержит функции для форматирования ввода/вывода, такие как printf.

Атрибут AutoOpen

К сборке можно применить атрибут AutoOpen, если требуется автоматически открывать пространство имен или модуль при указании ссылки на это сборку.Также можно применить атрибут AutoOpen к модулю, чтобы автоматически открывать его при открытии родительского модуля или пространства имен.Дополнительные сведения см. в разделе Класс Core.AutoOpenAttribute (F#).

Атрибут RequireQualifiedAccess

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

См. также

Ссылки

Пространства имен (F#)

Модули (F#)

Другие ресурсы

Справочник по языку F#