首頁  >  文章  >  後端開發  >  【c#教程】C# 特性(Attribute)

【c#教程】C# 特性(Attribute)

黄舟
黄舟原創
2016-12-24 13:29:511139瀏覽

C# 特性(Attribute)

特性(Attribute)是用於在運行時傳遞程式中各種元素(例如類別、方法、結構、枚舉、組件等)的行為資訊的聲明性標籤。您可以透過使用特性為程式新增聲明性資訊。一個聲明性標籤是透過放置在它所應用的元素前面的方括號([ ])來描述的。

特性(Attribute)用於添加元數據,如編譯器指令和註釋、描述、方法、類別等其他資訊。 .Net 框架提供了兩種類型的特性:預先定義特性和自訂特性。

規定特性(Attribute)

規定特性(Attribute)的語法如下:

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

特性(Attribute)的名稱和值是在方括號內規定的,放置在它所應用的元素之前。 positional_parameters 規定必需的訊息,name_parameter 規定可選的資訊。

預定義特性(Attribute)

.Net 框架提供了三種預定義特性:

AttributeUsage

Conditional

Obsolete

它規定了特性可應用到的項目的類型。

規定此特性的語法如下:

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

其中:

參數 validon 規定特性可被放置的語言元素。它是枚舉器 AttributeTargets 的值的組合。預設值是 AttributeTargets.All。

參數 allowmultiple(可選的)為此特性的 AllowMultiple 屬性(property)提供一個布林值。如果為 true,則該特性是多用的。預設值是 false(單用的)。

參數 inherited(可選的)為此特性的 Inherited 屬性(property)提供一個布林值。如果為 true,則該特性可被衍生類別繼承。預設值是 false(不被繼承)。

例如:

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

Conditional

這個預定義特性標記了一個條件方法,其執行依賴於它頂的預處理標識符。

它會造成方法呼叫的條件編譯,取決於指定的值,例如 Debug 或 Trace。例如,當偵錯程式碼時顯示變數的值。

規定該特性的語法如下:

[Conditional(
   conditionalSymbol
)]

例如:

[Conditional("DEBUG")]

下面的實例示範了該特性:

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

當上面的程式碼被編譯和執行時,它會產生下列結果:

In Main function
In Function 1
In Function 2

當上面的程式碼被編譯和執行時,它會產生下列結果:

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

Obs這個預定義特性標示了不應被使用的程式實體。它可以讓您通知編譯器丟棄某個特定的目標元素。例如,當一個新方法被用在一個類別中,但是您仍然想要保持類別中的舊方法,您可以透過顯示一個應該使用新方法,而不是舊方法的訊息,來標記它為obsolete(過時的)。

規定該特性的語法如下:

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

其中:

參數 message,是一個字串,描述項目為什麼過時的原因以及該替代使用什麼。

參數 iserror,是一個布林值。如果該值為 true,編譯器應把該專案的使用當作一個錯誤。預設值是 false(編譯器產生一個警告)。

下面的實例演示了該特性:

 Don't use OldMethod, use NewMethod instead

當您嘗試編譯該程式時,編譯器會給出一個錯誤訊息說明:

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

public class DeBugInfo : System.Attribute

創建自定義特性(Attribute)

.Net 框架允許創建自定義創建自定義特性,用於儲存聲明性的信息,且可在運行時被檢索。此資訊根據設計標準和應用程式需要,可與任何目標元素相關。

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

声明自定义特性

构建自定义特性

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

通过反射访问特性

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

声明自定义特性

一个新的自定义特性应派生自 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)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn