Namespaces (F#)
Um espaço para nome lhe permite organizar o código em áreas de funcionalidade relacionada, permitindo que você anexe um nome a um agrupamento de elementos do programa.
namespace [parent-namespaces.]identifier
Comentários
Se você deseja colocar o código em um namespace, a primeira declaração no arquivo deve declarar o namespace. O conteúdo do arquivo inteiro se tornarão parte do namespace.
Espaços para nome diretamente não podem conter valores e funções. Em vez disso, valores e funções devem ser incluídas nos módulos e módulos são incluídos nos namespaces. Espaços para nome podem conter tipos de módulos.
Espaços para nome podem ser declarados explicitamente com a palavra-chave do espaço para nome, ou implicitamente ao declarar um módulo. Para declarar um espaço para nome explicitamente, use a palavra-chave do espaço para nome seguida do nome do namespace. O exemplo a seguir mostra um arquivo de código que declara um espaço para nome Widgets com um tipo e um módulo incluído no namespace.
namespace Widgets
type MyWidget1 =
member this.WidgetName = "Widget1"
module WidgetsModule =
let widgetName = "Widget2"
Se todo o conteúdo do arquivo estiver em um módulo, você pode também declarar namespaces implicitamente, usando o module palavra-chave e fornecendo o novo nome de namespace no nome do módulo totalmente qualificado. O exemplo a seguir mostra um arquivo de código que declara um espaço para nome Widgets e um módulo de WidgetsModule, que contém uma função.
module Widgets.WidgetModule
let widgetFunction x y =
printfn "%A %A" x y
O código a seguir é equivalente ao código anterior, mas o módulo é uma declaração de local do módulo. Nesse caso, o espaço para nome deve aparecer em sua própria linha.
namespace Widgets
module WidgetModule =
let widgetFunction x y =
printfn "%A %A" x y
Se mais de um módulo é necessário no mesmo arquivo em um ou mais namespaces, você deve usar declarações do módulo local. Quando você usa declarações do módulo local, você não pode usar o espaço para nome qualificado nas declarações do módulo. O código a seguir mostra um arquivo que tenha uma declaração de namespace e duas declarações do módulo local. Nesse caso, os módulos estão contidos diretamente no namespace; Não há nenhum módulo implicitamente criado que tem o mesmo nome do arquivo. Qualquer outro código no arquivo, como um do de ligação, é no namespace, mas não nos módulos internos, para que você precise qualificar o membro do módulo widgetFunction usando o nome do módulo.
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
A saída deste exemplo é o seguinte.
Module1 10 20
Module2 5 6
Para obter mais informações, consulte Módulos (F#).
Espaços para nome aninhados
Quando você cria um namespace aninhado, preciso qualificá-la totalmente. Caso contrário, você pode criar um novo namespace de nível superior. Recuo é ignorado nas declarações de namespace.
O exemplo a seguir mostra como declarar um namespace aninhado.
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"
Espaços para nomes de arquivos e Assemblies
Espaços para nome podem abranger vários arquivos em um único projeto ou a compilação. O termo fragmento do namespace descreve a parte de um namespace que está incluído em um arquivo. Espaços para nome também podem abranger vários assemblies. Por exemplo, o System namespace inclui todo o .NET Framework, que engloba vários módulos (assemblies) e contém vários namespaces aninhados.
Namespace global
Você usa o namespace predefinido global para colocar os nomes na.NET namespace de nível superior.
namespace global
type SomeType() =
member this.SomeMember = 0
Você também pode usar global para fazer referência de nível superior.NET namespace, por exemplo, para resolver o nome conflita com outros espaços para nome.
global.System.Console.WriteLine("Hello World!")