Nella piattaforma .NET, e quindi in Visual Basic, gli attributi sono stati introdotti come uno strumento potente per annotare vari elementi di codice con metadati. Questo consente ai programmi e agli strumenti di ottenere ulteriori informazioni durante l'esecuzione e la compilazione, configurando il comportamento di metodi, classi e proprietà attraverso meccanismi di riflessione, serializzazione, automazione dei test, ecc.
Senza attributi, si è costretti a codificare rigidamente la logica aggiuntiva per configurare metodi o classi, e le librerie generiche non possono essere espandibili e flessibili senza informazioni esterne sulla classe o sul metodo. Inoltre, sorge la questione della trasmissione delle impostazioni senza modificare il codice stesso.
Gli attributi sono classi speciali che ereditano da Attribute. Possono essere creati e applicati a metodi, classi, proprietà, parametri o valori restituiti. Durante l'esecuzione, questi attributi possono essere scoperti tramite riflessione e modificare il comportamento della logica corrispondente.
Esempio di codice per creare e utilizzare un attributo personalizzato:
Imports System <AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method, AllowMultiple:=False)> Public Class InfoAttribute Inherits Attribute Public Property Description As String Public Sub New(desc As String) Description = desc End Sub End Class <Info("Metodo di logica aziendale speciale.")> Public Sub Calculate() Console.WriteLine("Calcolo eseguito.") End Sub ' Lettura dell'attributo tramite riflessione Dim method = GetType(Module1).GetMethod("Calculate") Dim attr = CType(Attribute.GetCustomAttribute(method, GetType(InfoAttribute)), InfoAttribute) If attr IsNot Nothing Then Console.WriteLine(attr.Description)
Caratteristiche principali:
AttributeTargets.Class, Method, Property, ecc.)Gli attributi possono cambiare direttamente il comportamento di un metodo o classe senza utilizzare la riflessione?
No, gli attributi di per sé contengono solo metadati. È possibile modificare il comportamento di un oggetto solo se il codice chiamante o il runtime controlla la presenza di un attributo tramite riflessione e intraprende azioni aggiuntive.
È possibile assegnare lo stesso attributo più volte allo stesso elemento, e cosa serve per farlo?
Di default - no. Per fare ciò, durante la dichiarazione dell'attributo, è necessario specificare AllowMultiple:=True in AttributeUsage. In tal modo, un attributo può essere applicato più volte a un singolo elemento.
Gli attributi vengono ereditati dalla classe base a quella derivata?
No, di default - non vengono ereditati. Se si desidera l'ereditarietà, in AttributeUsage va specificato il parametro Inherited:=True.
Nel progetto, vengono ampiamente applicati attributi personalizzati ai metodi, ma nessuno implementa l'elaborazione di questi attributi tramite riflessione — questo codice diventa un peso inutile, rendendo difficile la manutenzione e complicando la lettura del sorgente.
Vantaggi:
Svantaggi:
L'attributo è applicato per annotare i metodi di registrazione, e un sottosistema separato tramite riflessione determina automaticamente quali metodi devono essere auditati, inserendo analisi, aggiungendo tracciamento. Il comportamento è trasparente per l'utente.
Vantaggi:
Svantaggi: