Atributos (F#)

Atributos permitem que os metadados a serem aplicadas a uma construção de programação.

[<target:attribute-name(arguments)>]

Comentários

Na sintaxe anterior, o target é opcional e, se presente, especifica o tipo de entidade do programa que o atributo se aplica a. Os valores válidos para target são mostrados na tabela que aparece mais adiante neste documento.

O attribute-name refere-se ao nome do (possivelmente qualificado com espaços para nomes) de um tipo de atributo válido, com ou sem o sufixo Attribute que é geralmente usado em nomes de tipo de atributo. Por exemplo, o tipo de ObsoleteAttribute pode ser reduzida para apenas Obsolete neste contexto.

O arguments são os argumentos para o construtor para o tipo de atributo. Se um atributo tem um construtor padrão, a lista de argumentos e parênteses podem ser omitidos. Atributos oferecem suporte a argumentos posicionais e argumentos nomeados. Argumentos posicionais são argumentos usados na ordem em que aparecem. Argumentos nomeados podem ser usados se o atributo tem propriedades públicas. Você pode definir essas configurações usando a seguinte sintaxe na lista de argumentos.

property-name = property-value

Tais inicializações de propriedade podem estar em qualquer ordem, mas eles devem seguir quaisquer argumentos posicionais. A seguir é um exemplo de um atributo que usa argumentos posicionais e inicializações de propriedade.

open System.Runtime.InteropServices

[<DllImport("kernel32", SetLastError=true)>]
extern bool CloseHandle(nativeint handle)

Neste exemplo, o atributo é DllImportAttribute, usado aqui na forma abreviada. O primeiro argumento é um parâmetro posicional e o segundo é uma propriedade.

Atributos são um.NET construção de programação que permite que um objeto conhecido como um atributo a ser associado um tipo ou outro elemento de programa. O elemento de programa ao qual um atributo é aplicado é conhecido como o atributo de destino. O atributo geralmente contém metadados sobre seu destino. Nesse contexto, os metadados poderiam ser quaisquer dados sobre o tipo diferente de seus campos e membros.

Atributos de F# podem ser aplicados para as seguintes construções de programação: funções, métodos, assemblies, módulos, tipos (classes, registros, estruturas, interfaces, delegados, enumerações, uniões e assim por diante), construtores, propriedades, campos, parâmetros, parâmetros de tipo e valores de retorno. Atributos não são permitidos em let ligações dentro de classes, expressões ou expressões de fluxo de trabalho.

Normalmente, a declaração de atributo será exibida diretamente antes da declaração do atributo de destino. Várias declarações de atributo podem ser usadas em conjunto, da seguinte forma.

[<Owner("Jason Carlson")>]
[<Company("Microsoft")>]
type SomeType1 =

Você pode consultar os atributos em tempo de execução usando.NET reflexão.

Você pode declarar vários atributos individualmente, como no exemplo de código anterior, ou você pode declará-los em um conjunto de colchetes se você usar um ponto e vírgula para separar os atributos individuais e construtores, conforme mostrado aqui.

[<Owner("Darren Parker"); Company("Microsoft")>]
type SomeType2 =

Atributos encontrados normalmente incluem o Obsolete atributos de atributo, atributos, as considerações de segurança, COM suporte, atributos relacionados à propriedade de código e atributos que indica se um tipo pode ser serializado. O exemplo a seguir demonstra o uso de Obsolete atributo.

open System

[<Obsolete("Do not use. Use newFunction instead.")>]
let obsoleteFunction x y =
  x + y

let newFunction x y =
  x + 2 * y

// The use of the obsolete function produces a warning.
let result1 = obsoleteFunction 10 100
let result2 = newFunction 10 100

Para os destinos do atributo assembly e module, aplicar os atributos para um nível superior do a ligação de assembly. Você pode incluir a palavra assembly ou module na declaração de atributo, como segue:

open System.Reflection
[<assembly:AssemblyVersionAttribute("1.0.0.0")>]
do
   printfn "Executing..."

Se você omitir o atributo de destino para um atributo aplicado a uma do de vinculação, o compilador F# tenta determinar o destino de atributo que faça sentido para o atributo. Muitas classes de atributo tem um atributo do tipo AttributeUsageAttribute que inclui informações sobre os possíveis alvos, suportada para esse atributo. Se o AttributeUsageAttribute indica que o atributo oferece suporte a funções como destinos, o atributo é levado para aplicar o ponto de entrada principal do programa. Se o AttributeUsageAttribute indica que o atributo oferece suporte a assemblies como destinos, o compilador usa o atributo a ser aplicado ao assembly. A maioria dos atributos não se aplicam a assemblies e funções, mas em casos onde eles fazem, o atributo é levado para aplicar a função principal do programa. Se o atributo de destino for especificado explicitamente, o atributo é aplicado ao destino especificado.

Embora você normalmente precisa especificar o atributo explicitamente, direcione os valores válidos para target em um atributo são mostrados na tabela a seguir, junto com exemplos de uso.

Atributo de destino

Exemplo

Assembly

[<assembly: AssemblyVersionAttribute("1.0.0.0")>]

Retornar

let function1 x : [<return: Obsolete>] int = x + 1

campo

[<field: DefaultValue>] val mutable x: int

propriedade

[<property: Obsolete>] this.MyProperty = x

param

member this.MyMethod([<param: Out>] x : ref<int>) = x := 10

tipo

[<type: StructLayout(Sequential)>]

type MyStruct =

struct

x : byte

y : int

end

Consulte também

Outros recursos

Referência de linguagem do F#