C# Attribute
AttributeEs ist ein deklaratives Tag, das verwendet wird, um Verhaltensinformationen über verschiedene Elemente in einem Programm (wie Klassen, Methoden, Strukturen, Enumerationen, Komponenten usw.) zur Laufzeit zu übermitteln. Sie können einem Programm deklarative Informationen hinzufügen, indem Sie Attribute verwenden. Ein deklaratives Tag wird beschrieben, indem eckige Klammern ([ ]) vor das Element gesetzt werden, auf das es angewendet wird.
Attribute werden verwendet, um Metadaten hinzuzufügen, wie Compileranweisungen und Kommentare, Beschreibungen, Methoden, Klassen und andere Informationen. Das .NET Framework bietet zwei Arten von Attributen:vordefinierteMerkmale undbenutzerdefinierteMerkmale.
Angeben von Attributen (Attribute)
Die Syntax zum Angeben eines Attributs lautet wie folgt:
[attribute(positional_parameters, name_parameter = value, ...)] element
Der Name und der Wert des Attributs werden innerhalb eckiger Klammern angegeben und vor das Element gesetzt, auf das es angewendet wird. positional_parameters geben die erforderlichen Informationen an, während name_parameter die optionalen Informationen angibt.
Vordefiniertes Attribut
Das .NET Framework bietet drei vordefinierte Attribute:
- AttributeUsage
- Conditional
- Obsolete
AttributeUsage
Vordefinierte AttributeAttributeUsageBeschreibt, wie eine benutzerdefinierte Attributklasse verwendet wird. Es gibt die Typen von Elementen an, auf die das Attribut angewendet werden kann.
Die Syntax zum Angeben dieses Attributs lautet wie folgt:
[AttributeUsage( validon, AllowMultiple=allowmultiple, Inherited=inherited )]
Wobei:
- Der Parameter validon gibt die Sprachelemente an, auf denen das Attribut platziert werden kann. Es ist ein Enumerator.AttributeTargetsEine Kombination von Werten. Der Standardwert ist AttributeTargets.All。
- Parameterallowmultiple(Optional) für dieses AttributAllowMultipleDie Eigenschaft liefert einen booleschen Wert. Wenn true, ist das Attribut mehrfach verwendbar. Der Standardwert ist false (einmalige Verwendung).
- Parameterinherited⟧(Optional) für dieses Attribut(Optional) for this attributeInheritedDie Eigenschaft liefert einen booleschen Wert. Wenn true, kann das Attribut von abgeleiteten Klassen geerbt werden. Der Standardwert ist false (nicht geerbt).
Zum Beispiel:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
Conditional
Dieses vordefinierte Attribut markiert eine bedingte Methode, deren Ausführung vom angegebenen Präprozessor-Bezeichner abhängt.
Es führt eine bedingte Kompilierung von Methodenaufrufen durch, abhängig vom angegebenen Wert, wie z. B.Debugoder Trace. Zum Beispiel beim Debuggen von Code: den Wert einer Variablen anzeigen.
Die Syntax zum Angeben dieses Attributs lautet wie folgt:
[Conditional( conditionalSymbol )]
Zum Beispiel:
[Conditional("DEBUG")]
Das folgende Beispiel veranschaulicht diese Funktion:
Beispiel
using System;
using System.Diagnostics;
public class Myclass
{
[Conditional("DEBUG")]
public static void Message(string msg)
{
Console.WriteLine(msg);
}
}
class Test
{
static void function1()
{
Myclass.Message("In Funktion 1.");
function2();
}
static void function2()
{
Myclass.Message("In Funktion 2.");
}
public static void Main()
{
Myclass.Message("In der Main-Funktion.");
function1();
Console.ReadKey();
}
}
Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:
In Main function. In Function 1. In Function 2.
Obsolete
Dieses vordefinierte Attribut markiert eine Programm-Entität, die nicht verwendet werden sollte. Es ermöglicht Ihnen, den Compiler anzuweisen, ein bestimmtes Zielelement zu verwerfen. Wenn beispielsweise eine neue Methode in einer Klasse verwendet wird, Sie aber die alte Methode in der Klasse beibehalten möchten, können Sie sie als veraltet markieren, indem Sie eine Meldung anzeigen, dass die neue Methode anstelle der alten verwendet werden sollte.
Die Syntax zum Angeben dieses Attributs lautet wie folgt:
[Obsolete( message )] [Obsolete( message, iserror )]
Wobei:
- Parametermessage, ist eine Zeichenfolge, die beschreibt, warum das Element veraltet ist und welche Alternative verwendet werden sollte.
- Parameteriserror, ist ein boolescher Wert. Wenn der Wert true ist, sollte der Compiler die Verwendung des Elements als Fehler behandeln. Der Standardwert ist false (der Compiler generiert eine Warnung).
Das folgende Beispiel veranschaulicht diese Funktion:
Beispiel
public class MyClass
{
[Obsolete("Don't use OldMethod, use NewMethod instead", true)]
static void OldMethod()
{
Console.WriteLine("It is the old method");
}
static void NewMethod()
{
Console.WriteLine("It is the new method");
}
public static void Main()
{
OldMethod();
}
}
Wenn Sie versuchen, das Programm zu kompilieren, gibt der Compiler eine Fehlermeldung aus, die besagt:
Don't use OldMethod, use NewMethod instead
Benutzerdefinierte Attribute erstellen
Das .NET Framework ermöglicht das Erstellen benutzerdefinierter Attribute, die zum Speichern deklarativer Informationen verwendet werden und zur Laufzeit abgerufen werden können. Diese Informationen können sich je nach Designstandards und Anwendungsanforderungen auf jedes Zielelement beziehen.
Das Erstellen und Verwenden eines benutzerdefinierten Attributs umfasst vier Schritte:
- Deklarieren benutzerdefinierter Attribute
- Erstellen benutzerdefinierter Attribute
- Anwenden des benutzerdefinierten Attributs auf das Zielprogrammelement
- Zugriff auf Attribute über Reflektion
Der letzte Schritt umfasst das Schreiben eines einfachen Programms zum Lesen von Metadaten, um verschiedene Symbole zu finden. Metadaten sind Daten und Informationen, die zur Beschreibung anderer Daten verwendet werden. Dieses Programm sollte Reflektion verwenden, um zur Laufzeit auf Attribute zuzugreifen. Wir werden dies im nächsten Kapitel ausführlich besprechen.
Deklarieren benutzerdefinierter Attribute
Ein neues benutzerdefiniertes Attribut sollte vonSystem.AttributeKlasse abgeleitet werden. Zum Beispiel:
// 一个自定义特性 BugFix 被赋给类及其成员 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute
Im obigen Code haben wir ein benutzerdefiniertes Attribut namensDeBugInfobenutzerdefinierte Attribute deklariert.
Erstellen benutzerdefinierter Attribute
Lassen Sie uns ein benutzerdefiniertes Attribut namensDeBugInfoerstellen, das die vom Debugger erhaltenen Informationen speichert. Es speichert die folgenden Informationen:
- Die Codenummer des Fehlers
- Der Name des Entwicklers, der den Fehler identifiziert hat
- Das Datum der letzten Überprüfung des Codes
- Eine String-Nachricht, die die Notizen des Entwicklers speichert
unsereDeBugInfoDie Klasse wird drei private Eigenschaften haben, um die ersten drei Informationen zu speichern, und eine öffentliche Eigenschaft, um die Nachricht zu speichern. Daher werden die Fehlernummer, der Entwicklername und das Überprüfungsdatum erforderliche Positionsparameter der DeBugInfo-Klasse sein, und die Nachricht wird ein optionaler benannter Parameter sein.
Jedes Attribut muss mindestens einen Konstruktor haben. Erforderliche Positionsparameter sollten durch den Konstruktor übergeben werden. Der folgende Code demonstriertDeBugInfoKlasse:
Beispiel
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
public class DeBugInfo : System.Attribute
{
private int bugNo;
private string developer;
private string lastReview;
public string message;
public DeBugInfo(int bg, string dev, string d)
{
this.bugNo = bg;
this.developer = dev;
this.lastReview = d;
}
public int BugNo
{
get
{
return bugNo;
}
}
public string Developer
{
get
{
return developer;
}
}
public string LastReview
{
get
{
return lastReview;
}
}
public string Message
{
get
{
return message;
}
set
{
message = value;
}
}
}
Benutzerdefinierte Attribute anwenden
das Attribut anwenden, indem man es unmittelbar vor sein Ziel setzt:
Beispiel
[DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "Nicht verwendete Variable")]
class Rectangle
{
// Membervariablen
protected double length;
protected double width;
public Rectangle(double l, double w)
{
length = l;
width = w;
}
[DeBugInfo(55, "Zara Ali", "19/10/2012",
Message = "Rückgabetyp stimmt nicht überein")]
public double GetArea()
{
return length * width;
}
[DeBugInfo(56, "Zara Ali", "19/10/2012")]
public void Display()
{
Console.WriteLine("Länge: {0}", length);
Console.WriteLine("Breite: {0}", width);
Console.WriteLine("Fläche: {0}", GetArea());
}
}
Im nächsten Kapitel werden wir Objekte der Reflection-Klasse verwenden, um diese Informationen abzurufen.
Weitere Erweiterungen