Tutoriel C#SE CONNECTER
Tutoriel C#
auteur:php.cn  temps de mise à jour:2022-04-11 14:06:23

Attribut C#



L'attribut est utilisé pour transmettre divers éléments du programme au moment de l'exécution (balises déclaratives pour les comportements informations telles que classes, méthodes, structures, énumérations, composants, etc.). Vous pouvez ajouter des informations déclaratives à votre programme à l'aide d'attributs. Une balise déclarative est décrite par des crochets ([ ]) placés devant l'élément auquel elle s'applique.

L'attribut est utilisé pour ajouter des métadonnées, telles que des instructions et des commentaires du compilateur, des descriptions, des méthodes, des classes et d'autres informations. Le framework .Net propose deux types de fonctionnalités : les fonctionnalités Prédéfinies et les fonctionnalités Personnalisées.

Spécifier les attributs (Attribut)

La syntaxe de spécification des attributs (Attribut) est la suivante :

[attribute(positional_parameters, name_parameter = value, ...)]
element

Le nom et la valeur de l'attribut (Attribut) sont spécifiés entre crochets, placés où il se trouve avant l'élément appliqué. positional_parameters spécifie les informations requises, name_parameter spécifie les informations facultatives.

Attributs prédéfinis (Attribut)

.Le framework .Net fournit trois attributs prédéfinis :

  • AttributeUsage

  • Conditionnel

  • Obsolète

AttributeUsage

Attribut prédéfiniAttributeUsage décrit comment utiliser une classe d'attributs personnalisée. Il spécifie les types d'éléments auxquels la fonctionnalité peut être appliquée.

La syntaxe pour spécifier cet attribut est la suivante :

[AttributeUsage(
   validon,
   AllowMultiple=allowmultiple,
   Inherited=inherited
)]

où :

  • Le paramètre validon précise l'élément de langage dans lequel l'attribut peut être mis. C'est une combinaison des valeurs de l'énumérateur AttributeTargets. La valeur par défaut est AttributeTargets.All.

  • Paramètres allowmultiple (facultatif) Fournit une valeur booléenne pour la propriété AllowMultiple de cette fonctionnalité. Si c'est vrai, l'attribut est polyvalent. La valeur par défaut est false (à usage unique).

  • Paramètres inherited (facultatif) Fournit une valeur booléenne pour la propriété Inherited de cette fonctionnalité. Si vrai, cet attribut peut être hérité par les classes dérivées. La valeur par défaut est false (non héritée).

Par exemple :

[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property, 
AllowMultiple = true)]

Conditionnel

Cet attribut prédéfini marque une méthode conditionnelle dont l'exécution dépend de l'identifiant du préprocesseur qu'elle surmonte.

Il provoque une compilation conditionnelle des appels de méthode, en fonction de la valeur spécifiée, comme Debug ou Trace. Par exemple, affichez la valeur d'une variable lors du débogage du code.

La syntaxe pour spécifier cette fonctionnalité est la suivante :

[Conditional(
   conditionalSymbol
)]

Par exemple :

[Conditional("DEBUG")]

L'exemple suivant illustre cette fonctionnalité :

#define DEBUG
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 Function 1.");
        function2();
    }
    static void function2()
    {
        Myclass.Message("In Function 2.");
    }
    public static void Main()
    {
        Myclass.Message("In Main function.");
        function1();
        Console.ReadKey();
    }
}

Lorsque ce qui précède le code est compilé et une fois exécuté, il produit les résultats suivants :

In Main function
In Function 1
In Function 2

Obsolète

Cet attribut prédéfini marque les entités du programme qui ne doivent pas être utilisées. Il vous permet de demander au compilateur de supprimer un élément cible spécifique. Par exemple, lorsqu'une nouvelle méthode est utilisée dans une classe, mais que vous souhaitez 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 méthode. ).

La syntaxe pour spécifier cette fonctionnalité est la suivante :

[Obsolete(
   message
)]
[Obsolete(
   message,
   iserror
)]

où :

  • Paramètre message, est une chaîne décrivant le projet Raison pour laquelle il est obsolète et quoi utiliser à la place.

  • Le paramètre iserror est une valeur booléenne. Si cette valeur est vraie, le compilateur doit traiter l'utilisation de cet é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é :

using System;
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();
   }
}

Lorsque vous essayez de compiler ce programme, le compilateur affichera un message d'erreur indiquant :

 Don't use OldMethod, use NewMethod instead

Créer des attributs personnalisés (Attribut)

Le framework .Net permet la création d'attributs personnalisés qui stockent des informations déclaratives pouvant être récupérées au moment de l'exécution. Ces informations peuvent être associées à n'importe quel élément cible en fonction des critères de conception et des besoins de l'application.

La création et l'utilisation de fonctionnalités personnalisées impliquent quatre étapes :

  • Déclaration de fonctionnalités personnalisées

  • Création de fonctionnalités personnalisées

  • Appliquer des attributs personnalisés sur l'élément de programme cible

  • Accéder aux attributs via la réflexion

Dernier Les étapes comprennent l'écriture d'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. Le programme doit utiliser la réflexion pour accéder aux propriétés au moment de l'exécution. Nous en discuterons en détail dans le prochain chapitre.

Déclarer un attribut personnalisé

Un nouvel attribut personnalisé doit être dérivé de la classe System.Attribute. 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é appelé DeBugInfo.

Créer un attribut personnalisé

Créons un attribut personnalisé appelé 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 à laquelle ce code a été révisé pour la dernière fois

  • Un message de chaîne qui stocke les indicateurs des développeurs

NotreDeBugInfo La classe aura trois propriétés privées (propriété) utilisées pour stocker les trois premiers messages et une propriété publique (propriété) utilisée pour stocker le message. Ainsi, le numéro de bogue, le nom du développeur et la date de révision seront des paramètres de position requis de la classe DeBugInfo, et le message sera un paramètre nommé facultatif.

Chaque trait doit avoir au moins un constructeur. Les paramètres de position requis doivent être transmis via le constructeur. Le code suivant illustre la classe DeBugInfo :

// 一个自定义特性 BugFix 被赋给类及其成员
[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'un attribut personnalisé

Appliquez l'attribut en le plaçant immédiatement avant sa cible :

[DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "Return type mismatch")]
[DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "Unused variable")]
class Rectangle
{
  // 成员变量
  protected double length;
  protected double width;
  public Rectangle(double l, double w)
  {
      length = 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());
  }
}

In dans le chapitre suivant, nous utiliserons les objets de la classe Reflection pour récupérer ces informations.

Site Web PHP chinois