Пространства имен (F#)
Пространство имен предоставляет возможность организовать код в области связанной функциональности, позволяя присоединить имя к группе элементов программы.
namespace [parent-namespaces.]identifier
Заметки
Чтобы можно было поместить код в пространство имен, необходимо, чтобы первым объявлением в файле было объявление пространства имен.В этом случае все содержимое файла становится частью пространства имен.
Пространства имен не могут содержать непосредственные значения и функции.Вместо этого значения и функции должны содержаться в модулях, а модули — в пространствах имен.Пространства имен могут содержать типы и модули.
Пространства имен можно объявлять явно с помощью ключевого слова namespace или неявно при объявлении модуля.Чтобы объявить пространство имен явно, укажите его имя после ключевого слова namespace.В следующем примере представлен файл кода, в котором объявляется пространство имен Widgets, содержащее тип и модуль.
namespace Widgets
type MyWidget1 =
member this.WidgetName = "Widget1"
module WidgetsModule =
let widgetName = "Widget2"
Если все содержимое файла является частью одного модуля, можно объявить пространство имен неявно, указав ключевое слово module и имя нового пространства имен в полном имени модуля.В следующем примере показан файл кода с объявлением пространства имен Widgets и модуля WidgetsModule, содержащего функцию.
module Widgets.WidgetModule
let widgetFunction x y =
printfn "%A %A" x y
Следующий код эквивалентен предыдущему, но модуль объявлен локально.В данном случае пространство имен должно быть указано на отдельной строке.
namespace Widgets
module WidgetModule =
let widgetFunction x y =
printfn "%A %A" x y
Если требуется несколько модулей в одном и том же файле в одном или нескольких пространствах имен, необходимо использовать локальное объявление модулей.В локальном объявлении модулей не допускается использовать полное имя пространства имен.В следующем коде представлен файл, содержащий объявление пространства имен и два локальных объявления модулей.В данном случае модули содержатся непосредственно в пространстве имен, и нет явных указаний о создании модуля с таким же именем, как у файла.Любой другой код в файле, такой как привязка do, содержится в пространстве имен, но не во внутренних модулях, поэтому для члена модуля widgetFunction необходимо указать имя модуля.
namespace Widgets
module WidgetModule1 =
let widgetFunction x y =
printfn "Module1 %A %A" x y
module WidgetModule2 =
let widgetFunction x y =
printfn "Module2 %A %A" x y
module useWidgets =
do
WidgetModule1.widgetFunction 10 20
WidgetModule2.widgetFunction 5 6
Результат выполнения примера выглядит следующим образом.
Module1 10 20
Module2 5 6
Дополнительные сведения см. в разделе Модули (F#).
Вложенные пространства имен
При создании вложенного пространства имен необходимо указать его полное имя.В противном случае создается пространство имен верхнего уровня.В объявлении пространства имен отступ игнорируется.
В следующем примере показано объявление вложенного пространства имен.
namespace Outer
// Full name: Outer.MyClass
type MyClass() =
member this.X(x) = x + 1
// Fully qualify any nested namespaces.
namespace Outer.Inner
// Full name: Outer.Inner.MyClass
type MyClass() =
member this.Prop1 = "X"
Пространства имен в файлах и сборках
Пространства имен могут охватывать несколько файлов проекта или компиляции.Термин фрагмент пространства имен обозначает часть пространства имен, содержащуюся в одном файле.Пространства имен также могут охватывать несколько сборок.Например, пространство System полностью содержит платформу .NET Framework, занимающую несколько сборок и содержащую множество вложенных пространств имен.
Глобальное пространство имен
Для помещения имен в пространство имен .NET верхнего уровня используется предопределенное пространство имен global.
namespace global
type SomeType() =
member this.SomeMember = 0
Глобальное пространство имен можно также использовать для ссылки на пространство имен .NET верхнего уровня, например, чтобы устранить конфликты имен с другими пространствами имен.
global.System.Console.WriteLine("Hello World!")