Attributi (C#)Attributes (C#)

Gli attributi offrono un metodo efficace per l'associazione di metadati o informazioni dichiarative con il codice (assembly, tipi, metodi, proprietà e così via).Attributes provide a powerful method of associating metadata, or declarative information, with code (assemblies, types, methods, properties, and so forth). Dopo aver associato un attributo a un'entità di programma, in fase di esecuzione è possibile eseguire una query su tale attributo usando una tecnica denominata reflection.After an attribute is associated with a program entity, the attribute can be queried at run time by using a technique called reflection. Per altre informazioni, vedere Reflection (C#).For more information, see Reflection (C#).

Di seguito sono riportate le proprietà degli attributi:Attributes have the following properties:

  • Gli attributi aggiungono metadati al programma.Attributes add metadata to your program. I metadati sono informazioni relative ai tipi definiti in un programma.Metadata is information about the types defined in a program. Tutti gli assembly .NET contengono un set specificato di metadati che descrive i tipi e membri dei tipi definiti nell'assembly.All .NET assemblies contain a specified set of metadata that describes the types and type members defined in the assembly. È possibile aggiungere attributi personalizzati per specificare altre informazioni eventualmente necessarie.You can add custom attributes to specify any additional information that is required. Per altre informazioni, vedere Creazione di attributi personalizzati (C#).For more information, see, Creating Custom Attributes (C#).
  • È possibile applicare uno o più attributi a interi assembly, moduli o elementi di programma di minori dimensioni, ad esempio classi e proprietà.You can apply one or more attributes to entire assemblies, modules, or smaller program elements such as classes and properties.
  • Gli attributi possono accettare argomenti nello stesso modo dei metodi e delle proprietà.Attributes can accept arguments in the same way as methods and properties.
  • Il programma può esaminare i propri metadati oppure i metadati di un altro programma tramite reflection.Your program can examine its own metadata or the metadata in other programs by using reflection. Per altre informazioni, vedere Accesso agli attributi tramite reflection (C#).For more information, see Accessing Attributes by Using Reflection (C#).

Uso degli attributiUsing attributes

È possibile usare attributi nella maggior parte delle dichiarazioni, anche se la validità di un attributo specifico può essere limitata ad alcuni tipi di dichiarazione.Attributes can be placed on most any declaration, though a specific attribute might restrict the types of declarations on which it is valid. Per specificare un attributo in C# inserire il nome dell'attributo racchiuso tra parentesi quadre ([]) sopra la dichiarazione dell'entità a cui è applicato.In C#, you specify an attribute by placing the name of the attribute enclosed in square brackets ([]) above the declaration of the entity to which it applies.

Nell'esempio seguente l'attributo SerializableAttribute viene usato per applicare una caratteristica specifica a una classe:In this example, the SerializableAttribute attribute is used to apply a specific characteristic to a class:

[Serializable]
public class SampleClass
{
    // Objects of this type can be serialized.
}

Un metodo con l'attributo DllImportAttribute è dichiarato come nell'esempio seguente:A method with the attribute DllImportAttribute is declared like the following example:

[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();

In una dichiarazione è possibile inserire più attributi, come illustrato nell'esempio seguente:More than one attribute can be placed on a declaration as the following example shows:

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à.Some attributes can be specified more than once for a given entity. Un esempio di attributo multiuso è ConditionalAttribute:An example of such a multiuse attribute is ConditionalAttribute:

[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 delle librerie .NET.By convention, all attribute names end with the word "Attribute" to distinguish them from other items in the .NET libraries. Tuttavia, quando gli attributi vengono usati nel codice, non è necessario specificare il suffisso Attribute.However, you do not need to specify the attribute suffix when using attributes in code. Ad esempio [DllImport] è equivalente a [DllImportAttribute], mentre DllImportAttribute è il nome effettivo dell'attributo nella libreria di classi .NET Framework.For example, [DllImport] is equivalent to [DllImportAttribute], but DllImportAttribute is the attribute's actual name in the .NET Framework Class Library.

Parametri degli attributiAttribute parameters

Diversi attributi dispongono di parametri, che possono essere posizionali, senza nome o denominati.Many attributes have parameters, which can be positional, unnamed, or named. I parametri posizionali devono essere specificati in un determinato ordine e non possono essere omessi.Any positional parameters must be specified in a certain order and cannot be omitted. I parametri denominati sono facoltativi e possono essere specificati in qualsiasi ordine.Named parameters are optional and can be specified in any order. I parametri posizionali vengono specificati per primi.Positional parameters are specified first. I tre attributi seguenti, ad esempio, sono equivalenti:For example, these three attributes are equivalent:

[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. Gli altri parametri sono denominati.The first parameter, the DLL name, is positional and always comes first; the others are named. In questo caso, entrambi i parametri denominati sono impostati automaticamente su false e possono quindi essere omessi.In this case, both named parameters default to false, so they can be omitted. I parametri posizionali corrispondono ai parametri del costruttore dell'attributo.Positional parameters correspond to the parameters of the attribute constructor. I parametri denominati o facoltativi corrispondono a proprietà o campi dell'attributo.Named or optional parameters correspond to either properties or fields of the attribute. Per informazioni sui valori predefiniti dei parametri, fare riferimento alla documentazione di ciascun attributo.Refer to the individual attribute's documentation for information on default parameter values.

Destinazioni degli attributiAttribute targets

La destinazione di un attributo è l'entità a cui tale attributo viene applicato.The target of an attribute is the entity which the attribute applies to. Un attributo, ad esempio, può essere applicato a una classe, a un metodo particolare o a un intero assembly.For example, an attribute may apply to a class, a particular method, or an entire assembly. Per impostazione predefinita, un attributo viene applicato all'elemento che lo segue.By default, an attribute applies to the element that it precedes. È tuttavia possibile identificare in modo esplicito, ad esempio, se un attributo viene applicato a un metodo, al relativo parametro o al relativo valore restituito.But you can also explicitly identify, for example, whether an attribute is applied to a method, or to its parameter, or to its return value.

Per identificare in modo esplicito la destinazione di un attributo, usare la sintassi seguente:To explicitly identify an attribute target, use the following syntax:

[target : attribute-list]

Nella tabella seguente sono elencati i possibili valori di target.The list of possible target values is shown in the following table.

Valore di destinazioneTarget value Si applica aApplies to
assembly Intero assemblyEntire assembly
module Modulo di assembly correnteCurrent assembly module
field Campo in una classe o uno structField in a class or a struct
event eventEvent
method Metodo o funzioni di accesso alle proprietà get e setMethod or get and set property accessors
param Parametri del metodo o parametri della funzione di accesso alla proprietà setMethod parameters or set property accessor parameters
property ProprietàProperty
return Valore restituito di un metodo, un indicizzatore di proprietà o una funzione di accesso alla proprietà getReturn value of a method, property indexer, or get property accessor
type Struct, classe, interfaccia, enumeratore o delegatoStruct, class, interface, enum, or delegate

È necessario specificare il valore di destinazione field per applicare un attributo al campo sottostante creato per una proprietà implementata automaticamente.You would specify the field target value to apply an attribute to the backing field created for an auto-implemented property.

Nell'esempio seguente viene illustrato come applicare attributi ad assembly e moduli.The following example shows how to apply attributes to assemblies and modules. Per altre informazioni, vedere Attributi comuni (C#).For more information, see Common Attributes (C#).

using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]

Nell'esempio seguente viene illustrato come applicare gli attributi a metodi, parametri di metodo e valori restituiti dal metodo in C#.The following example shows how to apply attributes to methods, method parameters, and method return values in C#.

// default: applies to method
[ValidatedContract]
int Method1() { return 0; }

// applies to method
[method: ValidatedContract]
int Method2() { return 0; }

// applies to return value
[return: ValidatedContract]
int Method3() { return 0; }

Nota

Indipendentemente dalle destinazioni in cui l'oggetto ValidatedContract è definito come valido, è necessario specificare la destinazione return, anche se ValidatedContract viene definito in modo da essere valido solo per i valori restituiti.Regardless of the targets on which ValidatedContract is defined to be valid, the return target has to be specified, even if ValidatedContract were defined to apply only to return values. In altre parole, il compilatore non usa le informazioni AttributeUsage per risolvere le destinazioni degli attributi ambigue.In other words, the compiler will not use AttributeUsage information to resolve ambiguous attribute targets. Per altre informazioni, vedere AttributeUsage (C#).For more information, see AttributeUsage (C#).

Usi comuni degli attributiCommon uses for attributes

Di seguito vengono elencati alcuni degli usi comuni degli attributi nel codice:The following list includes a few of the common uses of attributes in code:

  • Contrassegno dei metodi mediante l'attributo WebMethod nei servizi Web per indicare che è possibile chiamare il metodo tramite il protocollo SOAP.Marking methods using the WebMethod attribute in Web services to indicate that the method should be callable over the SOAP protocol. Per ulteriori informazioni, vedere WebMethodAttribute.For more information, see WebMethodAttribute.
  • Descrizione della procedura di marshalling dei parametri del metodo durante l'interazione con il codice nativo.Describing how to marshal method parameters when interoperating with native code. Per ulteriori informazioni, vedere MarshalAsAttribute.For more information, see MarshalAsAttribute.
  • Descrizione delle proprietà COM per classi, metodi e interfacce.Describing the COM properties for classes, methods, and interfaces.
  • Chiamata al codice non gestito che usa la classe DllImportAttribute.Calling unmanaged code using the DllImportAttribute class.
  • Descrizione dell'assembly con indicazione di titolo, versione, descrizione o marchio.Describing your assembly in terms of title, version, description, or trademark.
  • Descrizione dei membri della classe da serializzare per la persistenza.Describing which members of a class to serialize for persistence.
  • Descrizione della procedura di mapping tra membri di una classe e nodi XML per la serializzazione XML.Describing how to map between class members and XML nodes for XML serialization.
  • Descrizione dei requisiti di sicurezza per i metodi.Describing the security requirements for methods.
  • Definizione delle caratteristiche usate per garantire la sicurezza.Specifying characteristics used to enforce security.
  • Controllo delle ottimizzazioni tramite il compilatore JIT (Just-In-Time), in modo da garantire un semplice debug del codice.Controlling optimizations by the just-in-time (JIT) compiler so the code remains easy to debug.
  • Recupero di informazioni relative al chiamante di un metodo.Obtaining information about the caller to a method.

Per altre informazioni, vedere:For more information, see:

Vedere ancheSee also