In der .NET-Plattform und somit in Visual Basic wurden Attribute als leistungsfähiges Werkzeug zum Anno-tieren verschiedener Codelemente mit Metadaten eingeführt. Dies ermöglicht es Programmen und Tools, zur Laufzeit und Kompilierungszeit zusätzliche Informationen zu erhalten und das Verhalten von Methoden, Klassen und Eigenschaften über Reflektions-, Serialisierungs- und Testautomatisierungsmechanismen anzupassen.
Ohne Attribute muss zusätzliche Logik hart codiert werden, um Methoden oder Klassen anzupassen, und universelle Bibliotheken können ohne externe Informationen über die Klasse oder Methode nicht erweiterbar und flexibel sein. Es gibt auch das Problem, Einstellungen zu übertragen, ohne den Code selbst zu ändern.
Attribute sind spezielle Klassen, die von Attribute erben. Sie können erstellt und auf Methoden, Klassen, Eigenschaften, Parameter oder Rückgabewerte angewendet werden. Zur Laufzeit können diese Attribute durch Reflexion entdeckt und das Verhalten der entsprechenden Logik geändert werden.
Beispielcode zur Erstellung und Verwendung eines eigenen Attributs:
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("Spezielle Geschäftsanwendungslogik Methode.")> Public Sub Calculate() Console.WriteLine("Berechnung ausgeführt.") End Sub ' Lesen des Attributs über Reflexion Dim method = GetType(Module1).GetMethod("Calculate") Dim attr = CType(Attribute.GetCustomAttribute(method, GetType(InfoAttribute)), InfoAttribute) If attr IsNot Nothing Then Console.WriteLine(attr.Description)
Schlüsselmerkmale:
AttributeTargets.Class, Method, Property usw.)Können Attribute direkt das Verhalten einer Methode oder Klasse ändern, ohne Reflexion zu verwenden?
Nein, Attribute selbst enthalten nur Metadaten. Das Verhalten eines Objekts kann nur geändert werden, wenn der aufrufende Code oder die Laufzeit das Vorhandensein des Attributs über Reflexion überprüft und zusätzliche Maßnahmen ergreift.
Kann man dasselbe Attribut mehrmals auf dasselbe Element anwenden, und was ist dazu notwendig?
Standardmäßig — nein. Dazu muss bei der Deklaration des Attributs AllowMultiple:=True in AttributeUsage angegeben werden. Dann kann dasselbe Attribut mehrmals auf dasselbe Element angewendet werden.
Erben Attribute von der Basisklasse zur abgeleiteten Klasse?
Nein, standardmäßig erben sie nicht. Wenn Vererbung erforderlich ist, muss in AttributeUsage der Parameter Inherited:=True angegeben werden.
In einem Projekt werden massenhaft benutzerdefinierte Attribute für Methoden hinzugefügt, aber niemand implementiert die Verarbeitung dieser Attribute über Reflexion — solcher Code wird zu nutzloser Last, die die Wartung erschwert und das Lesen des Quellcodes kompliziert.
Vorteile:
Nachteile:
Ein Attribut wird verwendet, um Methoden zum Logging zu annotieren, und ein separates System erfährt durch Reflexion automatisch, welche Methoden eine Überprüfung benötigen, fügt Analysen ein und ergänzt das Tracing. Das Verhalten bleibt für den Benutzer transparent.
Vorteile:
Nachteile: