Attributi (F#)
Gli attributi consentono l'applicazione dei metadati a un costrutto di programmazione.
[<target:attribute-name(arguments)>]
Note
Nella sintassi precedente target è facoltativo e, se presente, specifica il tipo di entità del programma a cui l'attributo si applica.I valori validi per target sono illustrati nella tabella disponibile più avanti in questo documento.
attribute-name si riferisce al nome (eventualmente qualificato con gli spazi dei nomi) di un tipo di attributo valido, con o senza suffisso Attribute, utilizzato in genere nei nomi di tipo degli attributi.Il tipo ObsoleteAttribute può ad esempio essere abbreviato solo in Obsolete in questo contesto.
L'elemento arguments include gli argomenti del costruttore per il tipo di attributo.Se un attributo dispone di un costruttore predefinito, l'elenco di argomenti e le parentesi possono essere omessi.Gli attributi supportano sia gli argomenti posizionali che quelli denominati.Gli argomenti posizionali sono argomenti utilizzati nell'ordine con cui vengono visualizzati.Gli argomenti denominati possono essere utilizzati se l'attributo dispone di proprietà pubbliche.Questi argomenti possono essere impostati utilizzando la sintassi seguente nell'elenco di argomenti.
property-name = property-value
Tali inizializzazioni delle proprietà possono essere in qualsiasi ordine, ma devono essere rispettati eventuali argomenti posizionali.Di seguito è disponibile un esempio di attributo in cui vengono utilizzati argomenti posizionali e inizializzazioni delle proprietà.
open System.Runtime.InteropServices
[<DllImport("kernel32", SetLastError=true)>]
extern bool CloseHandle(nativeint handle)
In questo esempio l'attributo è DllImportAttribute, utilizzato nella sua forma abbreviata.Il primo argomento è un parametro posizionale e il secondo è una proprietà.
Gli attributi sono un costrutto di programmazione .NET che consente di associare un oggetto, noto come attributo, a un tipo o a un altro elemento del programma.L'elemento del programma a cui viene applicato un attributo è noto come destinazione dell'attributo.L'attributo contiene in genere metadati relativi alla sua destinazione.In questo contesto, i metadati possono essere costituiti da dati qualsiasi relativi al tipo ad eccezione di campi e membri.
Gli attributi in F# possono essere applicati ai costrutti di programmazione seguenti: funzioni, metodi, assembly, moduli, tipi (classi, record, strutture, interfacce, delegati, enumerazioni, unioni e così via), costruttori, proprietà, campi, parametri, parametri di tipo e valori restituiti.Gli attributi non sono consentiti nelle associazioni let all'interno di classi, espressioni o espressioni del flusso di lavoro.
In genere, la dichiarazione di attributo appare direttamente prima della dichiarazione della destinazione dell'attributo.È possibile utilizzare più dichiarazioni di attributo contemporaneamente, come illustrato di seguito.
[<Owner("Jason Carlson")>]
[<Company("Microsoft")>]
type SomeType1 =
È possibile eseguire una query sugli attributi in fase di esecuzione utilizzando la reflection .NET.
È possibile dichiarare più attributi individualmente, come nell'esempio di codice precedente, oppure è possibile dichiararli in un set di parentesi, se si utilizza un punto e virgola per separare i singoli attributi e costruttori, come illustrato di seguito.
[<Owner("Darren Parker"); Company("Microsoft")>]
type SomeType2 =
In genere, gli attributi utilizzati includono l'attributo Obsolete, attributi per considerazioni sulla sicurezza, attributi per supporto COM, attributi correlati alla proprietà del codice e attributi che indicano se un tipo può essere serializzato.Nell'esempio seguente viene illustrato l'utilizzo dell'attributo 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
Per le destinazioni degli attributi assembly e module, gli attributi si applicano all'associazione do di un livello principale nell'assembly.È possibile includere la parola assembly o module nella dichiarazione di attributo, come illustrato di seguito.
open System.Reflection
[<assembly:AssemblyVersionAttribute("1.0.0.0")>]
do
printfn "Executing..."
Se si omette la destinazione per un attributo applicato all'associazione do, il compilatore F# tenta di determinare la destinazione appropriata per tale attributo.Numerose classi di attributi dispongono di un attributo di tipo AttributeUsageAttribute che include informazioni sulle possibili destinazioni supportate dall'attributo stesso.Se AttributeUsageAttribute indica che l'attributo supporta le funzioni come destinazione, l'attributo viene applicato al punto di ingresso principale del programma.Se AttributeUsageAttribute indica che l'attributo supporta gli assembly come destinazione, l'attributo viene applicato dal compilatore all'assembly.La maggior parte degli attributi non si applica sia a funzioni che ad assembly, ma, nel caso questo avvenga, l'attributo viene applicato alla funzione principale del programma.Se la destinazione dell'attributo viene specificata in modo esplicito, l'attributo viene applicato alla destinazione specificata.
Sebbene in genere non sia necessario specificare in modo esplicito la destinazione dell'attributo, i valori validi per target in un attributo sono illustrati nella tabella seguente, insieme ad alcuni esempi di utilizzo.
Destinazione dell'attributo |
Esempio |
---|---|
assembly |
[<assembly: AssemblyVersionAttribute("1.0.0.0")>] |
return |
let function1 x : [<return: Obsolete>] int = x + 1 |
campo |
[<field: DefaultValue>] val mutable x: int |
Proprietà |
[<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 |