Atributos (F#)

Los atributos de F# permiten aplicar metadatos a una construcción de programación.

Sintaxis

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

Comentarios

En la sintaxis anterior, el destino 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 el destino se muestran en la tabla que aparece más adelante en este documento.

El nombre de atributo hace referencia al nombre (posiblemente calificado con espacios de nombres) de un tipo de atributo válido, con o sin el sufijo Attribute que se usa normalmente en los nombres de tipo de atributo. Por ejemplo, el tipo ObsoleteAttribute se puede acortar en solo Obsolete en este contexto.

Los argumentos son los argumentos para el constructor del tipo de atributo. Si un atributo tiene un constructor sin parámetros, se puede omitir la lista de argumentos y paréntesis. Los atributos admiten tanto argumentos posicionales como argumentos con nombre. Los argumentos posicionales son argumentos que se usan en el orden en que aparecen. Los argumentos con nombre se pueden usar si el atributo tiene propiedades públicas. Puede establecerlos mediante la sintaxis siguiente en la lista de argumentos.

property-name = property-value

Estas inicializaciones de propiedad pueden estar en cualquier orden, pero deben seguir cualquier argumento posicional. A continuación se muestra un ejemplo de un atributo que usa argumentos posicionales e inicializaciones de propiedades:

open System.Runtime.InteropServices

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

En este ejemplo, el atributo es DllImportAttribute, que se usa aquí en forma abreviada. El primer argumento es un parámetro posicional y el segundo es una propiedad.

Los atributos son una construcción de programación de .NET que permite que un objeto conocido como atributo esté asociado a un tipo u otro elemento de programa. El elemento program al que se aplica un atributo se conoce como destino del atributo. El atributo normalmente contiene metadatos sobre su destino. En este contexto, los metadatos podrían ser cualquier dato sobre el tipo distinto de sus campos y miembros.

Los atributos de F# se pueden aplicar a las siguientes construcciones de programación: 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 atributos en enlaces let dentro de clases, expresiones o expresiones de flujo de trabajo.

Normalmente, la declaración de atributo aparece directamente antes de la declaración del destino del atributo. Se pueden usar varias declaraciones de atributo juntas, como se indica a continuación:

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

Puede consultar atributos en tiempo de ejecución mediante la reflexión de .NET.

Puede declarar varios atributos individualmente, como en el ejemplo de código anterior, o puede declararlos en un conjunto de corchetes si usa un punto y coma para separar los atributos y constructores individuales, como se indica a continuación:

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

Los atributos encontrados normalmente incluyen el atributo Obsolete, atributos para consideraciones de seguridad, atributos para compatibilidad COM, atributos relacionados con la propiedad del código y atributos que indican si se puede serializar un tipo. El siguiente ejemplo de código demuestra 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, se aplican los atributos a un enlace do de nivel superior en el ensamblado. Puede incluir la palabra assembly o ``module`` en la declaración de atributo, como se indica a continuación:

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

Si omite el destino de atributo de un atributo aplicado a un enlace do, el compilador de F# intenta determinar el destino del atributo que tiene sentido para ese atributo. Muchas clases de atributo tienen un atributo de tipo System.AttributeUsageAttribute que incluye información sobre los posibles destinos admitidos para ese atributo. Si System.AttributeUsageAttribute indica que el atributo admite funciones como destinos, el atributo se aplica al punto de entrada principal del programa. Si System.AttributeUsageAttribute indica que el atributo admite ensamblados como destinos, el compilador toma el atributo que se va a aplicar al ensamblado. La mayoría de los atributos no se aplican a las funciones y ensamblados, pero en los casos en los que lo hacen, el atributo se aplica a la función principal del programa. Si el destino del atributo se especifica explícitamente, el atributo se aplica al destino especificado.

Aunque normalmente no es necesario especificar explícitamente el destino del atributo, los valores válidos para el destino en un atributo junto con ejemplos de uso se muestran en la tabla siguiente:

Destino de atributo Ejemplo
ensamblado
[<assembly: AssemblyVersion("1.0.0.0")>]
module
[<``module``: MyCustomAttributeThatWorksOnModules>]
return
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
campo
[<DefaultValue>] val mutable x: int
propiedad
[<Obsolete>] this.MyProperty = x
param
member this.MyMethod([<Out>] x : ref<int>) = x := 10
type
[<type: StructLayout(LayoutKind.Sequential)>]
type MyStruct =
  struct
    val x : byte
    val y : int
  end

Vea también