C# Attribut
AttributC'est une balise déclarative utilisée pour transmettre des informations comportementales sur divers éléments d'un programme (tels que des classes, des méthodes, des structures, des énumérations, des composants, etc.) à l'exécution. Vous pouvez ajouter des informations déclaratives à un programme en utilisant des attributs. Une balise déclarative est décrite en plaçant des crochets ([ ]) devant l'élément auquel elle est appliquée.
Les attributs sont utilisés pour ajouter des métadonnées, telles que des instructions et commentaires du compilateur, des descriptions, des méthodes, des classes et d'autres informations. Le framework .Net fournit deux types d'attributs :prédéfiniesFonctionnalités etpersonnaliséesFonctionnalités.
Spécification des attributs (Attribut)
La syntaxe pour spécifier un attribut est la suivante :
[attribute(positional_parameters, name_parameter = value, ...)] element
Le nom et la valeur de l'attribut sont spécifiés entre crochets et placés avant l'élément auquel il s'applique. positional_parameters spécifient les informations requises, tandis que name_parameter spécifie les informations facultatives.
Attribut prédéfini
Le framework .Net fournit trois attributs prédéfinis :
- AttributeUsage
- Conditional
- Obsolete
AttributeUsage
Attributs prédéfinisAttributeUsageDécrit comment utiliser une classe d'attribut personnalisée. Il spécifie les types d'éléments auxquels l'attribut peut être appliqué.
La syntaxe pour spécifier cet attribut est la suivante :
[AttributeUsage( validon, AllowMultiple=allowmultiple, Inherited=inherited )]
Où :
- Le paramètre validon spécifie les éléments de langage sur lesquels l'attribut peut être placé. Il s'agit d'un énumérateur.AttributeTargetsUne combinaison de valeurs. La valeur par défaut est AttributeTargets.All。
- Paramètreallowmultiple(Facultatif) pour cet attributAllowMultipleLa propriété fournit une valeur booléenne. Si true, l'attribut est à usages multiples. La valeur par défaut est false (usage unique).
- Paramètreinherited(Facultatif) pour cet attributInheritedLa propriété fournit une valeur booléenne. Si true, l'attribut peut être hérité par les classes dérivées. La valeur par défaut est false (non hérité).
Par exemple :
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
Conditional
Cet attribut prédéfini marque une méthode conditionnelle dont l'exécution dépend de l'identificateur de prétraitement spécifié.
Il provoque la compilation conditionnelle des appels de méthode, selon la valeur spécifiée, telle queDebugou Trace. Par exemple, lors du débogage du code, afficher la valeur d'une variable.
La syntaxe pour spécifier cet attribut est la suivante :
[Conditional( conditionalSymbol )]
Par exemple :
[Conditional("DEBUG")]
L'exemple suivant illustre cette fonctionnalité :
Exemple
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("Dans la fonction 1.");
function2();
}
static void function2()
{
Myclass.Message("Dans la fonction 2.");
}
public static void Main()
{
Myclass.Message("Dans la fonction Main.");
function1();
Console.ReadKey();
}
}
Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :
In Main function. In Function 1. In Function 2.
Obsolete
Cet attribut prédéfini marque une entité de programme qui ne doit pas être utilisée. Il vous permet d'indiquer au compilateur d'ignorer un élément cible spécifique. Par exemple, lorsqu'une nouvelle méthode est utilisée dans une classe, mais que vous souhaitez toujours conserver l'ancienne méthode dans la classe, vous pouvez la marquer comme obsolète en affichant un message indiquant que la nouvelle méthode doit être utilisée à la place de l'ancienne.
La syntaxe pour spécifier cet attribut est la suivante :
[Obsolete( message )] [Obsolete( message, iserror )]
Où :
- Paramètremessage, est une chaîne qui décrit pourquoi l'élément est obsolète et quelle alternative doit être utilisée.
- Paramètreiserror, est une valeur booléenne. Si la valeur est true, le compilateur doit traiter l'utilisation de l'élément comme une erreur. La valeur par défaut est false (le compilateur génère un avertissement).
L'exemple suivant illustre cette fonctionnalité :
Exemple
public class MyClass
{
[Obsolete("N'utilisez pas OldMethod, utilisez NewMethod à la place", true)]
static void OldMethod()
{
Console.WriteLine("C'est l'ancienne méthode");
}
static void NewMethod()
{
Console.WriteLine("C'est la nouvelle méthode");
}
public static void Main()
{
OldMethod();
}
}
Lorsque vous essayez de compiler le programme, le compilateur génère un message d'erreur indiquant :
Don't use OldMethod, use NewMethod instead
Création d'attributs personnalisés
Le .NET Framework permet de créer des attributs personnalisés, qui sont utilisés pour stocker des informations déclaratives et peuvent être récupérés au moment de l'exécution. Ces informations peuvent être liées à n'importe quel élément cible selon les normes de conception et les exigences de l'application.
La création et l'utilisation d'un attribut personnalisé impliquent quatre étapes :
- Déclaration d'attributs personnalisés
- Construction d'attributs personnalisés
- Appliquer l'attribut personnalisé à l'élément de programme cible
- Accès aux attributs via la réflexion
La dernière étape consiste à écrire un programme simple pour lire les métadonnées afin de trouver divers symboles. Les métadonnées sont des données et des informations utilisées pour décrire d'autres données. Ce programme doit utiliser la réflexion pour accéder aux attributs au moment de l'exécution. Nous aborderons cela en détail dans le chapitre suivant.
Déclaration d'attributs personnalisés
Un nouvel attribut personnalisé doit dériver deSystem.AttributeClasse. Par exemple :
// 一个自定义特性 BugFix 被赋给类及其成员 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute
Dans le code ci-dessus, nous avons déclaré un attribut personnalisé nomméDeBugInfoAttributs personnalisés.
Construction d'attributs personnalisés
Construisons un attribut personnalisé nomméDeBugInfo, qui stockera les informations obtenues par le débogueur. Il stocke les informations suivantes :
- Le numéro de code du bug
- Le nom du développeur qui a identifié le bug
- La date de la dernière révision du code
- Un message de type chaîne stockant les notes du développeur
notreDeBugInfoLa classe aura trois propriétés privées pour stocker les trois premières informations et une propriété publique pour stocker le message. Par conséquent, le numéro de bug, le nom du développeur et la date de révision seront des paramètres positionnels requis de la classe DeBugInfo, et le message sera un paramètre nommé facultatif.
Chaque attribut doit avoir au moins un constructeur. Les paramètres positionnels requis doivent être passés via le constructeur. Le code suivant illustreDeBugInfoClasse :
Exemple
[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;
}
}
}
Application d'attributs personnalisés
en appliquant l'attribut en le plaçant immédiatement avant sa cible :
Exemple
[DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "Unused variable")]
class Rectangle
{
// Variables membres
protected double length;
protected double width;
public Rectangle(double l, double w)
{
longueur = l;
width = w;
}
[DeBugInfo(55, "Zara Ali", "19/10/2012",
Message = "Return type mismatch")]
public double GetArea()
{
return length * width;
}
[DeBugInfo(56, "Zara Ali", "19/10/2012")]
public void Display()
{
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
Dans le chapitre suivant, nous utiliserons les objets de la classe Reflection pour récupérer ces informations.
autres extensions