多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

中國最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2

csharp教程

C# 特性(Attribute)

閱讀 (2150)

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

預定義特性 AttributeUsage 描述了如何使用一個自定義特性類。它規定了特性可應用到的項目的類型。

規定該特性的語法如下:

[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.Field |
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

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

規定該特性的語法如下:

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

其中:

  • 參數 message,是一個字符串,描述項目為什么過時的原因以及該替代使用什么。
  • 參數 iserror,是一個布爾值。如果該值為 true,編譯器應把該項目的使用當作一個錯誤。默認值是 false(編譯器生成一個警告)。

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

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

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

 Don't use OldMethod, use NewMethod instead

創建自定義特性(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());
  }
}

在下一章中,我們將使用 Reflection 類對象來檢索這些信息。

關閉
程序員人生
主站蜘蛛池模板: 校园春色欧美色图 | 三级国产精品一区二区 | 亚洲线精品久久一区二区三区 | 日本爱爱视频 | 欧美一区二区三区久久综 | 欧美日本一区二区三区道 | 波多野结衣中文字幕久久 | 欧美国产成人免费观看永久视频 | 一级女性全黄生活片免费看 | 女性一级全黄生活片在线播放 | 国产午夜精品久久久久免费视 | 国产女人在线视频 | 亚洲精品久久久久影院 | 成人eeuss影院在线观看 | 日产免费线路一区二区三区 | 日本在线观看中文字幕 | asianjapanese日本护士 | 国产极品粉嫩交性大片 | 日本在线一区二区 | 亚洲精品久久99久久一区 | 12306ys播播影院午夜 | 国产亚洲精 | 456亚洲人成影视在线观看 | 亚洲国产精品综合久久一线 | 武则天级淫片a级中文 | 国内精品哆啪啪 | 曰曰碰天天碰国产 | 操人视频免费 | 国产欧美中文字幕 | 天天夜夜狠狠 | 宇都宫紫苑在线观看 | 国产精品日韩欧美亚洲另类 | 成人欧美在线 | 日韩一级在线播放免费观看 | 波多野结衣中文一区二区免费 | 国产成人一区二区三区高清 | 亚洲视频在线免费 | 在线观看 a国v | 亚洲国产精品欧美综合 | 日韩五月| 欧美另类69xxxx |