Atributos (F#)
Los atributos permiten aplicar metadatos a una construcción de programación.
Sintaxis
[<target:attribute-name(arguments)>]
Observaciones
En la sintaxis anterior, el de 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 objetivo 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 a 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 pueden omitir la lista de argumentos y los paréntesis. Los atributos admiten argumentos posicionales y argumentos con nombre. 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 formato abreviado. 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 asociar un objeto conocido como atributo 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 vinculaciones de 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 conjuntamente varias declaraciones de atributos, como se indica a continuación:
[<Owner("Jason Carlson")>]
[<Company("Microsoft")>]
type SomeType1 =
Puede consultar atributos en tiempo de ejecución utilizando la reflexión en .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 =
Normalmente, los atributos encontrados incluyen el atributo Obsolete
, los atributos para consideraciones de seguridad, los atributos para la compatibilidad COM, los atributos relacionados con la propiedad del código y los atributos que indican si se puede serializar un tipo. En el ejemplo siguiente 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
, 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 del atributo para un atributo aplicado a un enlace de do
, el compilador de F# intenta determinar el destino de atributo que tiene sentido para ese atributo. Muchas clases de atributos tienen un atributo de tipo System.AttributeUsageAttribute
que incluye información sobre los posibles destinos admitidos para ese atributo. Si el System.AttributeUsageAttribute
indica que el atributo admite funciones como destinos, se toma el atributo para aplicar al punto de entrada principal del programa. Si el System.AttributeUsageAttribute
indica que el atributo admite ensamblados como destinos, el compilador toma el atributo para aplicarlo al ensamblado. La mayoría de los atributos no se aplican tanto a funciones como a ensamblados, pero en los casos en los que lo hacen, se toma el atributo para aplicar 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 destino en un atributo junto con ejemplos de uso se muestran en la tabla siguiente:
Objetivo del atributo | Ejemplo |
---|---|
ensamblado |
|
módulo |
|
método |
|
clase |
|
struct |
|
interfaz |
|
enum |
|
constructor |
|
devolución |
|
campo |
|
propiedad |
|
param |
|
tipo |
|