Atributos (F#)
Los atributos permiten que los metadatos se apliquen 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 al 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.
Attribute-name hace referencia al nombre (posiblemente calificado con espacios de nombres) de un tipo de atributo válido, con o sin el sufijo que normalmente se usa en los nombres de Attribute tipo de atributo. Por ejemplo, el tipo ObsoleteAttribute se puede acortar a solo en este Obsolete contexto.
Los argumentos son los argumentos del constructor para el 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. 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 establecer estos valores 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 los argumentos posicionales. 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 , aquí se usa 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 asociar un objeto conocido como atributo a un tipo u otro elemento de programa. El elemento de programa al que se aplica un atributo se conoce como el destino del atributo. El atributo normalmente contiene metadatos sobre su destino. En este contexto, los metadatos podrían ser cualquier dato sobre el tipo que no sea 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, entre otros), constructores, propiedades, campos, parámetros, parámetros de tipo y valores devueltos. No se permiten atributos en let enlaces 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 atributos juntas, como se muestra 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 entre corchetes si usa un punto y coma para separar los atributos y constructores individuales, como se muestra a continuación:
[<Owner("Darren Parker"); Company("Microsoft")>]
type SomeType2 =
Los atributos encontrados normalmente incluyen el atributo , los atributos para las consideraciones de seguridad, los atributos para la compatibilidad con COM, los atributos relacionados con la propiedad del código y los atributos que indican si se puede Obsolete serializar un tipo. En el ejemplo siguiente se muestra el uso del 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 los destinos de assembly atributo y , se aplican los atributos a un enlace de nivel superior en el module do ensamblado. Puede incluir la palabra assembly o en la declaración de ``module`` atributo, como se muestra a continuación:
open System.Reflection
[<assembly:AssemblyVersionAttribute("1.0.0.0")>]
[<``module``:MyCustomModuleAttribute>]
do
printfn "Executing..."
Si omite el destino de atributo para un atributo aplicado a un enlace, el compilador de F# intenta determinar el destino de atributo que tiene do 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 indica que el atributo admite funciones como destinos, se toma el atributo para aplicarlo al punto de entrada System.AttributeUsageAttribute principal del programa. Si indica que el atributo admite ensamblados como destinos, el compilador toma System.AttributeUsageAttribute el atributo para aplicarlo al ensamblado. La mayoría de los atributos no se aplican a funciones y ensamblados, pero en los casos en los que lo hacen, se toma el atributo para aplicarlo 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 el destino de atributo explícitamente, los valores válidos para target en un atributo junto con ejemplos de uso se muestran en la tabla siguiente:
| Destino de atributo | Ejemplo |
|---|---|
| ensamblado | |
| module | |
| return | |
| campo | |
| propiedad | |
| param | |
| type |
|