W platformie .NET, a zatem w Visual Basic, atrybuty zostały wprowadzone jako potężne narzędzie do annotacji różnych elementów kodu metadanymi. Umożliwia to programom i narzędziom w czasie wykonania i kompilacji uzyskiwanie dodatkowych informacji, dostosowywanie zachowania metod, klas, właściwości poprzez mechanizmy refleksji, serializacji, automatyzacji testowania i tak dalej.
Bez atrybutów trzeba sztywno kodować dodatkową logikę do dostosowywania metod lub klas, a uniwersalne biblioteki nie mogą być rozszerzalne i elastyczne bez zewnętrznych informacji o klasie lub metodzie. Pojawia się również problem przekazywania ustawień bez modyfikacji samego kodu.
Atrybuty to specjalne klasy dziedziczące po klasie Attribute. Można je tworzyć i stosować do metod, klas, właściwości, parametrów lub wartości zwracanych. W czasie wykonania te atrybuty można wykryć za pomocą refleksji i zmienić zachowanie odpowiedniej logiki.
Przykład kodu tworzenia i używania własnego atrybutu:
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("Metoda specjalnej logiki biznesowej.")> Public Sub Calculate() Console.WriteLine("Obliczenie ukończone.") End Sub ' Odczyt atrybutu przez refleksję Dim method = GetType(Module1).GetMethod("Calculate") Dim attr = CType(Attribute.GetCustomAttribute(method, GetType(InfoAttribute)), InfoAttribute) If attr IsNot Nothing Then Console.WriteLine(attr.Description)
Kluczowe cechy:
AttributeTargets.Class, Method, Property i inne)Czy atrybuty mogą bezpośrednio zmienić zachowanie metody lub klasy bez użycia refleksji?
Nie, same w sobie atrybuty zawierają jedynie metadane. Zmienić zachowanie obiektu można tylko, jeśli kod wywołujący lub runtime sprawdza obecność atrybutu przez refleksję i podejmuje dodatkowe działania.
Czy można przypisać ten sam atrybut kilka razy do tego samego elementu i co jest do tego wymagane?
Domyślnie — nie. W tym celu przy deklaracji atrybutu należy określić AllowMultiple:=True w AttributeUsage. Wtedy można stosować jeden atrybut kilka razy do jednego elementu.
Czy atrybuty dziedziczą z klasy bazowej do pochodnej?
Nie, domyślnie — nie dziedziczą. Jeśli wymagana jest dziedziczenie, w AttributeUsage należy określić parametr Inherited:=True.
W projekcie masowo stosowane są niestandardowe atrybuty do metod, ale nikt nie realizuje przetwarzania tych atrybutów przez refleksję — taki kod staje się bezużytecznym balastem, utrudniającym utrzymanie i komplikującym czytanie źródeł.
Zalety:
Wady:
Atrybut jest stosowany do annotacji metod logowania, a oddzielny subsystem przez refleksję automatycznie określa, które metody podlegają audytowi, podstawia analitykę, dodaje śledzenie. Zachowanie jest przezroczyste dla użytkownika.
Zalety:
Wady: