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


Пространства имен (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!")

См. также

Ссылки

Модули (F#)

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

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