Maîtriser les attributs en C# : enrichir le code avec des métadonnées
Un attribut est une étiquette déclarative qui transmet des informations au runtime sur les comportements d'éléments (classes, méthodes, structures, énumérateurs, assemblies...).
On ajoute des métadonnées (instructions compilateur, commentaires, descriptions...) via des attributs. Notation : crochets [ ] au-dessus de l'élément.
Deux types : prédefinis (framework .NET) et personnalisés.
Spécification d'un attribut
[attribut(paramètres_positionnels, paramètre_nommé = valeur, ...)] élément
Attributs prédéfinis
AttributeUsageConditionalObsolete
AttributeUsage
Définit comment un attribut personnalisé peut être utilisé.
[AttributeUsage(validon, AllowMultiple = allowmultiple, Inherited = inherited)]
validon: éléments cibles (combinaisonAttributeTargets). Défaut :AllAllowMultiple: true = multi-usage. Défaut : falseInherited: true = hérité par classes dérivées. Défaut : false
Conditional
Marque une méthode dont l'exécution dépend d'un symbole de préprocesseur (ex: DEBUG, TRACE). Compilation conditionnelle des appels.
[Conditional("DEBUG")]
public static void Message(string msg) { Console.WriteLine(msg); }
Obsolete
Marque un élément comme obsolète. Avertissement ou erreur à la compilation.
[Obsolete("N'utilisez pas OldMethod, utilisez NewMethod", true)]
static void OldMethod() { ... }
Le second paramètre true = erreur compilation, false = avertissement (défaut).
Création d'attributs personnalisés
4 étapes :
- Déclarer l'attribut (hériter de
System.Attribute) - Construire l'attribut (constructeur, propriétés)
- Appliquer sur élément cible
- Accéder via réflexion (runtime)
Déclaration
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | ..., AllowMultiple = true)]
public class InfoDebug : System.Attribute
Construction : classe InfoDebug
public class InfoDebug : System.Attribute
{
private int numeroBug;
private string developpeur;
private string derniereRevue;
public string message;
public InfoDebug(int bg, string dev, string d)
{
this.numeroBug = bg;
this.developpeur = dev;
this.derniereRevue = d;
}
public int NumeroBug { get { return numeroBug; } }
public string Developpeur { get { return developpeur; } }
public string DerniereRevue { get { return derniereRevue; } }
public string Message { get { return message; } set { message = value; } }
}
Application
[InfoDebug(45, "Zara Ali", "12/08/2012", Message = "Type retour incorrect")]
[InfoDebug(49, "Nuha Ali", "10/10/2012", Message = "Variable inutilisée")]
class Rectangle
{
protected double longueur, largeur;
public Rectangle(double l, double w) { longueur = l; largeur = w; }
[InfoDebug(55, "Zara Ali", "19/10/2012", Message = "Type retour incorrect")]
public double ObtenirAire() { return longueur * largeur; }
[InfoDebug(56, "Zara Ali", "19/10/2012")]
public void Afficher() { ... }
}
La lecture via réflexion sera couverte au chapitre suivant.
Langue C
- Maîtriser Java 8 Optional : Guide pratique pour un code sans null
- Comprendre les types nullables en C# : gérer les valeurs nulles en toute sécurité
- Ferro-Titanit® Cromoni – Alliage de titane haute résistance, non magnétique
- Alliage AgCu20 : Propriétés mécaniques et thermiques complètes à 23°C
- Alliage 15CDV6 (DIN 1.7734) : Haute Résistance, Tenacité & Soudabilité Aisée
- DIN 1.7734 5 – Alliage 15CDV6 : Haute Résistance, Tenacité & Soudabilité Aisée
- Alliage 15CDV6 (DIN 1.7734) – Haute Résistance, Soudage Facile, Tenacité Supérieure
- Alliage PtNi10 : Propriétés Mécaniques & Thermiques Complètes
- Alliage PtIr10 Platine-Iridium : Matériau Haute Résistance & Haute Température