Atributos (F#)
Los atributos permiten aplicar metadatos a una construcción de programación.
[<target:attribute-name(arguments)>]
Comentarios
En la sintaxis anterior, target es opcional y, si está presente, especifica el tipo de entidad de programa a la que se aplica el atributo.Los valores válidos para target se muestran en la tabla que parece más adelante en este documento.
attribute-name se refiere al nombre (posiblemente calificado con espacios de nombres) de un tipo de atributo válido, con o sin el sufijo Attribute que se suele utilizar en los nombres de tipo de atributo.Por ejemplo, el tipo ObsoleteAttribute se puede acortar a Obsolete en este contexto.
arguments son los argumentos para el constructor correspondiente al tipo de atributo.Si un atributo tiene un constructor predeterminado, la lista de argumentos y los paréntesis se puede omitir.Los atributos admiten argumentos posicionales y argumentos con nombre.Los argumentos posicionales son aquellos que se utilizan en el orden en el que aparecen.Los argumentos con nombre se pueden utilizar si el atributo tiene propiedades públicas.Se pueden establecer utilizando la sintaxis siguiente en la lista de argumentos.
property-name = property-value
Estas inicializaciones de propiedad pueden estar en cualquier orden, pero deben ir detrás de los argumentos posicionales.A continuación se muestra un ejemplo de atributo que utiliza argumentos posicionales e inicializaciones de propiedad.
open System.Runtime.InteropServices
[<DllImport("kernel32", SetLastError=true)>]
extern bool CloseHandle(nativeint handle)
En este ejemplo, el atributo es DllImportAttribute, que se utiliza abreviado en este caso.El primer argumento es un parámetro posicional, y el segundo, una propiedad.
Los atributos son una construcción de programación de .NET que permite que un objeto denominado atributo se asocie a un tipo o a otro elemento de programa.El elemento de programa al que se aplica un atributo se denomina destino de atributo.El atributo suele contener metadatos acerca de su destino.En este contexto, los metadatos podrían ser cualquier dato sobre el tipo, excepto sus campos y miembros.
Los atributos en F# se pueden aplicar a las construcciones de programación siguientes: funciones, métodos, ensamblados, módulos, tipos (clases, registros, estructuras, interfaces, delegados, enumeraciones, uniones, etc.), constructores, propiedades, campos, parámetros, parámetros de tipo y valores devueltos.No se permiten los atributos en los enlaces let dentro de las clases, las expresiones o las expresiones de flujo de trabajo.
Normalmente, la declaración de atributos aparece directamente antes de la declaración del destino de atributo.Se pueden utilizar varias declaraciones de atributos juntas, como sigue.
[<Owner("Jason Carlson")>]
[<Company("Microsoft")>]
type SomeType1 =
Los atributos se pueden consultar en tiempo de ejecución mediante la reflexión de .NET.
Se pueden declarar varios atributos individualmente, como en el ejemplo de código anterior, o bien se pueden declarar en un conjunto de corchetes si se utiliza un signo de punto y coma para separar los atributos y constructores individuales, como se muestra aquí.
[<Owner("Darren Parker"); Company("Microsoft")>]
type SomeType2 =
Los atributos más frecuentes son el atributo Obsolete, los atributos de consideraciones de seguridad, los atributos para la compatibilidad con COM, los atributos que están relacionados con la propiedad del código y los atributos que indican si un tipo se puede serializar.En el siguiente ejemplo se muestra el uso del atributo Obsolete.
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 los destinos de atributo assembly y module, los atributos se aplican a un enlace do de nivel superior en el ensamblado.Se puede incluir la palabra assembly o module en la declaración de atributos, como sigue.
open System.Reflection
[<assembly:AssemblyVersionAttribute("1.0.0.0")>]
do
printfn "Executing..."
Si se omite el destino de atributo para un atributo aplicado a un enlace do, el compilador de F# intenta determinar el destino de atributo lógico para ese atributo.Muchas clases de atributos tienen un atributo de tipo AttributeUsageAttribute que incluye información sobre los posibles destinos admitidos para ese atributo.Si AttributeUsageAttribute indica que el atributo admite funciones como destinos, se supone que el atributo es aplicable al punto de entrada principal del programa.Si AttributeUsageAttribute indica que el atributo admite ensamblados como destinos, el compilador supone que el atributo es aplicable al ensamblado.La mayoría de los atributos no se aplican a funciones y ensamblados, pero en los casos en que sí, se supone que el atributo es aplicable a la función principal del programa.Si el destino de atributo se especifica de manera explícita, el atributo se aplica a ese destino especificado.
Si bien normalmente no es preciso especificar explícitamente el destino de un atributo, en la tabla siguiente se muestran los valores válidos de target así como ejemplos de su uso.
Destino de atributo |
Ejemplo |
---|---|
assembly |
[<assembly: AssemblyVersionAttribute("1.0.0.0")>] |
return |
let function1 x : [<return: Obsolete>] int = x + 1 |
campo |
[<field: DefaultValue>] val mutable x: int |
Propiedad |
[<property: Obsolete>] this.MyProperty = x |
param |
member this.MyMethod([<param: Out>] x : ref<int>) = x := 10 |
type |
[<type: StructLayout(Sequential)>] type MyStruct = struct x : byte y : int end |