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.

z0w1kczw.collapse_all(it-it,VS.110).gifParametri 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.

z0w1kczw.collapse_all(it-it,VS.110).gifDestinazioni 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

Proprietà

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.

  • Ottenere informazioni sulla chiamante a un metodo.

Sezioni correlate

Per ulteriori informazioni, vedere:

Vedere anche

Riferimenti

Reflection (C# e Visual Basic)

Concetti

Guida per programmatori C#

Altre risorse

Guida per programmatori Visual Basic

Estensione di metadati mediante attributi