Heim  >  Artikel  >  Backend-Entwicklung  >  [c#-Tutorial] C#-Attribute (Attribut)

[c#-Tutorial] C#-Attribute (Attribut)

黄舟
黄舟Original
2016-12-24 13:29:511139Durchsuche

C#-Attribut

Attribut ist eine deklarative Methode, mit der Verhaltensinformationen verschiedener Elemente im Programm (z. B. Klassen, Methoden, Strukturen, Aufzählungen, Komponenten usw.) zur Laufzeit übertragen werden. Label. Mithilfe von Attributen können Sie Ihrem Programm deklarative Informationen hinzufügen. Ein deklaratives Tag wird durch eckige Klammern ([ ]) beschrieben, die vor dem Element stehen, für das es gilt.

Attribut wird zum Hinzufügen von Metadaten wie Compileranweisungen und -kommentaren, Beschreibungen, Methoden, Klassen und anderen Informationen verwendet. Das .Net-Framework bietet zwei Arten von Attributen: vordefinierte Attribute und benutzerdefinierte Attribute.

Spezifiziert ein Attribut (Attribut)

Die Syntax zum Angeben eines Attributs (Attribut) lautet wie folgt:

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

Der Name und Wert eines Attributs (Attribut) werden in eckigen Klammern angegeben und vor dem Element platziert, auf das sie angewendet werden. positional_parameters gibt erforderliche Informationen an, name_parameter gibt optionale Informationen an.

Vordefinierte Attribute (Attribut)

.Net Framework bietet drei vordefinierte Attribute:

AttributeUsage

Bedingt

Veraltet

AttributeUsage

Das vordefinierte Attribut AttributeUsage beschreibt, wie eine benutzerdefinierte Attributklasse verwendet wird. Es gibt die Arten von Elementen an, auf die die Funktion angewendet werden kann.

Die Syntax zur Angabe dieses Attributs lautet wie folgt:

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

Wobei:

Der Parameter validon gibt das Sprachelement an, in dem das Attribut platziert werden kann. Es handelt sich um eine Kombination der Werte des Enumerators AttributeTargets. Der Standardwert ist AttributeTargets.All.

Der Parameterallowmultiple (optional) stellt einen booleschen Wert für die AllowMultiple-Eigenschaft des Features bereit. Wenn „true“, ist das Attribut vielseitig. Der Standardwert ist false (einmalige Verwendung).

Der Parameter „inherited“ (optional) stellt einen booleschen Wert für die Eigenschaft „Inherited“ dieser Funktion bereit. Wenn „true“, kann dieses Attribut von abgeleiteten Klassen geerbt werden. Der Standardwert ist false (nicht vererbt).

Zum Beispiel:

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

Bedingt

Dieses vordefinierte Attribut markiert eine bedingte Methode, deren Ausführung von der Präprozessor-ID abhängt, die sie überragt.

Es bewirkt eine bedingte Kompilierung von Methodenaufrufen, abhängig vom angegebenen Wert, z. B. Debug oder Trace. Zeigen Sie beispielsweise beim Debuggen von Code den Wert einer Variablen an.

Die Syntax zum Angeben dieser Funktion lautet wie folgt:

[Conditional(
   conditionalSymbol
)]

Zum Beispiel:

[Conditional("DEBUG")]

Das folgende Beispiel veranschaulicht diese Funktion:

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

Wenn der obige Code kompiliert und ausgeführt wird, werden die folgenden Ergebnisse erzeugt:

In Main function
In Function 1
In Function 2

Veraltet

Dieses vordefinierte Attribut markiert Programmentitäten, die nicht verwendet werden sollten. Damit können Sie den Compiler anweisen, ein bestimmtes Zielelement zu verwerfen. Wenn beispielsweise eine neue Methode in einer Klasse verwendet wird, Sie aber dennoch die alte Methode in der Klasse behalten möchten, können Sie sie als veraltet markieren, indem Sie eine Meldung anzeigen, dass die neue Methode anstelle der alten Methode verwendet werden soll ).

Die Syntax zum Spezifizieren dieser Funktion lautet wie folgt:

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

Wobei:

Der Parameter message ist eine Zeichenfolge, die den Grund beschreibt, warum das Projekt veraltet ist und was stattdessen zu verwenden.

Der Parameter iserror ist ein boolescher Wert. Wenn dieser Wert wahr ist, sollte der Compiler die Verwendung dieses Elements als Fehler behandeln. Der Standardwert ist false (der Compiler generiert eine Warnung).

Das folgende Beispiel demonstriert diese Funktion:

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

Wenn Sie versuchen, dieses Programm zu kompilieren, gibt der Compiler eine Fehlermeldung aus:

 Don't use OldMethod, use NewMethod instead

Benutzerdefiniert erstellen Attribute (Attribut)

Das .Net-Framework ermöglicht die Erstellung benutzerdefinierter Attribute, die deklarative Informationen speichern, die zur Laufzeit abgerufen werden können. Diese Informationen können je nach Designkriterien und Anwendungsanforderungen jedem Zielelement zugeordnet werden.

创建并使用自定义特性包含四个步骤:

声明自定义特性

构建自定义特性

在目标程序元素上应用自定义特性

通过反射访问特性

最后一个步骤包含编写一个简单的程序来读取元数据以便查找各种符号。元数据是用于描述其他数据的数据和信息。该程序应使用反射来在运行时访问特性。我们将在下一章详细讨论这点。

声明自定义特性

一个新的自定义特性应派生自 System.Attribute 类。例如:

// 一个自定义特性 BugFix 被赋给类及其成员
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]

public class DeBugInfo : System.Attribute

在上面的代码中,我们已经声明了一个名为 DeBugInfo 的自定义特性。

构建自定义特性

让我们构建一个名为 DeBugInfo 的自定义特性,该特性将存储调试程序获得的信息。它存储下面的信息:

bug 的代码编号

辨认该 bug 的开发人员名字

最后一次审查该代码的日期

一个存储了开发人员标记的字符串消息

我们的 DeBugInfo 类将带有三个用于存储前三个信息的私有属性(property)和一个用于存储消息的公有属性(property)。所以 bug 编号、开发人员名字和审查日期将是 DeBugInfo 类的必需的定位( positional)参数,消息将是一个可选的命名(named)参数。

每个特性必须至少有一个构造函数。必需的定位( positional)参数应通过构造函数传递。下面的代码演示了 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;
      }
  }
}

应用自定义特性

通过把特性放置在紧接着它的目标之前,来应用该特性:

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

 以上就是【c#教程】C# 特性(Attribute)的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn