Attributi (C# e Visual Basic)
Gli attributi offrono un metodo efficace per l'associazione di metadati o informazioni dichiarative con il codice (assembly, tipi, metodi, proprietà e così via). È possibile eseguire una query su un attributo in fase di esecuzione dopo averlo associato a un'entità di programma, utilizzando una tecnica denominata reflection. Per ulteriori informazioni, vedere Reflection (C# e Visual Basic).
Di seguito sono riportate le caratteristiche principali degli attributi:
Aggiungono metadati al programma. I metadati sono informazioni sui tipi definiti in un programma. Tutti gli assembly .NET contengono un set di metadati specifico che descrive i tipi e i membri dei tipi definiti nell'assembly. È possibile aggiungere attributi personalizzati per specificare le eventuali informazioni aggiuntive richieste. Per ulteriori informazioni, vedere Creazione di attributi personalizzati (C# e Visual Basic).
È possibile applicare uno o più attributi a interi assembly, moduli o parti più piccole di programmi, quali classi e proprietà.
Gli attributi sono in grado di accettare argomenti, esattamente come i metodi e le proprietà.
Il programma può esaminare i metadati del programma stesso o di altri programmi utilizzando la reflection. Per ulteriori informazioni, vedere Accesso agli attributi tramite reflection (C# e Visual Basic).
Utilizzo degli attributi
È possibile utilizzare attributi in quasi tutte le dichiarazioni, anche se la validità di un attributo specifico può essere ristretta ad alcuni tipi di dichiarazione. In C# un attributo viene specificato inserendo il nome dell'attributo, racchiuso tra parentesi quadre ([]), sopra la dichiarazione dell'entità a cui l'attributo si riferisce. In Visual Basic un attributo è racchiuso tra parentesi acute (< >) e deve apparire immediatamente prima dell'elemento a cui si riferisce, sulla stessa riga.
Nell'esempio riportato di seguito viene utilizzato l'attributo SerializableAttribute per applicare una caratteristica specifica a una classe:
<System.Serializable()> Public Class SampleClass
' Objects of this type can be serialized.
End Class
[System.Serializable]
public class SampleClass
{
// Objects of this type can be serialized.
}
Un metodo con l'attributo DllImportAttribute viene dichiarato nel modo seguente:
Imports System.Runtime.InteropServices
...
<System.Runtime.InteropServices.DllImport("user32.dll")>
Sub SampleMethod()
End Sub
using System.Runtime.InteropServices;
...
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();
In una dichiarazione è possibile inserire più di un attributo:
Imports System.Runtime.InteropServices
...
Sub MethodA(<[In](), Out()> ByVal x As Double)
End Sub
Sub MethodB(<Out(), [In]()> ByVal x As Double)
End Sub
using System.Runtime.InteropServices;
...
void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }
Alcuni attributi possono essere specificati più volte per una stessa entità. Un esempio di attributo multiuso è ConditionalAttribute:
<Conditional("DEBUG"), Conditional("TEST1")>
Sub TraceMethod()
End Sub
[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
// ...
}
Nota
Per convenzione tutti i nomi di attributo terminano con la parola "Attribute", in modo che sia possibile distinguerli da altri elementi di .NET Framework. Tuttavia, quando gli attributi vengono utilizzati nel codice non è necessario specificare il suffisso Attribute. Ad esempio, [DllImport] è equivalente a [DllImportAttribute], mentre DllImportAttribute è il nome effettivo dell'attributo in .NET Framework.
Parametri degli attributi
Numerosi attributi dispongono di parametri, che possono essere posizionali, senza nome o denominati. I parametri posizionali devono essere specificati in un determinato ordine e non possono essere omessi. I parametri denominati sono invece facoltativi e possono essere specificati in qualsiasi ordine. I parametri posizionali vengono specificati per primi. I seguenti tre attributi, ad esempio, sono equivalenti:
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
<DllImport("user32.dll")>
<DllImport("user32.dll", SetLastError:=False, ExactSpelling:=False)>
<DllImport("user32.dll", ExactSpelling:=False, SetLastError:=False)>
Il primo parametro, ovvero il nome della DLL, è posizionale ed è sempre specificato per primo, mentre gli altri sono denominati. In questo caso, entrambi i parametri denominati sono impostati automaticamente su false e possono quindi essere omessi. Per informazioni sui valori predefiniti dei parametri, fare riferimento alla documentazione del singolo attributo.
Destinazioni degli attributi
La destinazione di un attributo è l'entità a cui l'attributo si riferisce. Un attributo può ad esempio riferirsi a una classe, a un metodo specifico o a un intero assembly. Per impostazione predefinita, un attributo si riferisce all'elemento che esso precede. È inoltre possibile identificare in modo esplicito, ad esempio, se un attributo si riferisce a un metodo, al relativo parametro o al valore restituito.
Per identificare in modo esplicito la destinazione di un attributo, utilizzare la sintassi seguente:
[target : attribute-list]
<target : attribute-list>
Nella tabella seguente sono elencati i possibili valori di target.
C# |
Visual Basic |
Si applica a |
---|---|---|
assembly |
Assembly |
Intero assembly |
module |
Module |
Modulo dell'assembly corrente (diverso da un modulo di Visual Basic) |
field |
Non supportato |
Campo in una classe o uno struct. |
event |
Non supportato |
Evento |
method |
Non supportato |
Metodo o funzioni di accesso alle proprietà get e set |
param |
Non supportato |
Parametri del metodo o parametri della funzione di accesso alla proprietà set |
property |
Non supportato |
Property |
return |
Non supportato |
Valore restituito di un metodo, di un indicizzatore di proprietà o della funzione di accesso alla proprietà get |
type |
Non supportato |
Struct, classe, interfaccia, enumerazione o delegato |
Nell'esempio seguente viene illustrato come applicare attributi ad assembly e moduli. Per ulteriori informazioni, vedere Attributi comuni (C# e Visual Basic).
Imports System.Reflection
<Assembly: AssemblyTitleAttribute("Production assembly 4"),
Module: CLSCompliant(True)>
using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]
Nell'esempio seguente viene illustrato come applicare attributi a metodi, parametri dei metodi e valori restituiti dai metodi in C#.
// default: applies to method
[SomeAttr]
int Method1() { return 0; }
// applies to method
[method: SomeAttr]
int Method2() { return 0; }
// applies to return value
[return: SomeAttr]
int Method3() { return 0; }
Nota
Indipendentemente dalle destinazioni in cui l'oggetto SomeAttr viene definito come valido, è necessario specificare la destinazione return, anche se l'oggetto SomeAttr è stato definito per riferirsi solo ai valori restituiti. In altre parole, il compilatore non utilizza le informazioni di AttributeUsage per risolvere le destinazioni di attributo ambigue. Per ulteriori informazioni, vedere AttributeUsage (C# e Visual Basic).
Utilizzi comuni degli attributi
Di seguito vengono elencati alcuni degli utilizzi comuni degli attributi nel codice.
Contrassegno dei metodi mediante l'attributo WebMethod nei servizi Web per indicare che è possibile chiamare il metodo tramite il protocollo SOAP. Per ulteriori informazioni, vedere WebMethodAttribute.
Descrizione della procedura di marshalling dei parametri del metodo durante l'interazione con il codice nativo. Per ulteriori informazioni, vedere MarshalAsAttribute.
Descrizione delle proprietà COM per classi, metodi e interfacce.
Chiamata di codice non gestito mediante la classe DllImportAttribute.
Descrizione dell'assembly con indicazione di titolo, versione, descrizione o marchio.
Descrizione dei membri della classe da serializzare per la persistenza.
Descrizione della procedura di mapping tra membri di una classe e nodi XML per la serializzazione XML.
Descrizione dei requisiti di sicurezza per i metodi.
Definizione delle caratteristiche utilizzate per garantire la sicurezza.
Controllo delle ottimizzazioni tramite il compilatore JIT, in modo da garantire un semplice debug del codice.
Sezioni correlate
Per ulteriori informazioni, vedere:
Accesso agli attributi tramite reflection (C# e Visual Basic)
Procedura: creare un'unione C/C++ tramite attributi (C# e Visual Basic)
Vedere anche
Riferimenti
Reflection (C# e Visual Basic)
Concetti
Estensione di metadati mediante attributi