Declarações de importação: A palavra-abrir chave (F#)
Um Importar declaração Especifica um módulo ou cujos elementos que você pode referenciar sem usar um nome totalmente qualificado do namespace.
open module-or-namespace-name
Comentários
Referência ao código, usando o caminho totalmente qualificado do namespace ou módulo sempre pode criar código que é difícil de escrever, ler e manter.Em vez disso, você pode usar o open palavra-chave para usados em módulos e namespaces para que quando você faz referência a um membro desse módulo ou namespace, você pode usar a forma abreviada do nome em vez do nome totalmente qualificado.This keyword is similar to the using keyword in C#, usingnamespace in Visual C++, and Imports in Visual Basic.
O módulo ou o namespace fornecido deve estar no mesmo projeto ou em um projeto referenciado ou assembly.Se não for, você pode adicionar uma referência ao projeto ou usar o -reference comando-opção de linha (ou abreviatura, -r).Para mais informações, consulte Opções do compilador (F#).
A declaração de importação disponibiliza os nomes no código que segue a declaração, até o final do delimitador namespace, módulo ou arquivo.
Quando você usa várias declarações de importação devem ser exibidos em linhas separadas.
O código a seguir mostra o uso de open palavra-chave para simplificar o código.
// 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..."
O compilador F# não emitir um aviso ou erro quando ambigüidades ocorrem quando ocorre o mesmo nome em mais de um namespace ou módulo aberto.Quando ocorrem ambigüidades, F# dá preferência para o namespace ou módulo abertos mais recentemente.Por exemplo, no código a seguir, empty significa Seq.empty, embora empty está localizado em ambos os List e Seq módulos.
open List
open Seq
printfn "%A" empty
Portanto, tenha cuidado quando você abrir módulos ou namespaces, como List ou Seq que contêm membros que têm nomes idênticos; em vez disso, considere o uso de nomes qualificados.Você deve evitar qualquer situação na qual o código é dependente da ordem das declarações de importação.
Namespaces que são abertas por padrão
Alguns namespaces são usados freqüentemente em código F# que são abertos implicitamente sem a necessidade de uma declaração de importação explícita.A tabela a seguir mostra os namespaces que são abertos por padrão.
Namespace |
Descrição |
---|---|
Microsoft.FSharp.Core |
Contém definições de tipo F# básicas para tipos internos, como int e float. |
Microsoft.FSharp.Core.Operators |
Contém operações aritméticas básicas como + e *. |
Microsoft.FSharp.Collections |
Contém classes de coleção imutáveis, como List e Array. |
Microsoft.FSharp.Control |
Contém tipos de construções de controle como avaliação lenta e fluxos de trabalho assíncronos. |
Microsoft.FSharp.Text |
Contém funções de e/S formatada, como o printf função. |
Atributo AutoOpen
Você pode aplicar o AutoOpen de atributo a um assembly se você deseja abrir automaticamente um namespace ou módulo quando o assembly é referenciado.Você também pode aplicar o AutoOpen de atributo a um módulo para abrir o módulo automaticamente quando o módulo pai ou namespace é aberto.Para mais informações, consulte Classe Core.AutoOpenAttribute (F#).
Atributo RequireQualifiedAccess
Alguns tipos de união, registros ou módulos podem especificar o atributo RequireQualifiedAccess.Ao fazer referência a elementos desses módulos, registros ou uniões, você deve usar um nome qualificado independentemente de se incluir uma declaração de importação.Se você usar esse atributo estrategicamente em nomes de tipos que definem comumente usados, ajudar a evitar colisões de nome e assim tornar o código mais resistentes a alterações nas bibliotecas.Para mais informações, consulte Classe Core.RequireQualifiedAccessAttribute (F#).