1. 程式人生 > >菜鳥教程C#高階教程

菜鳥教程C#高階教程

C#特性(Attribute)

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


預定義特性AttributeUsage:預定義特性attributeusage描述瞭如何使用一個自定義特性類,它規定了特性可應用到的專案的型別。

[AttributeUsage(
validon,
AllowMultiple=allowmultiple,
Inherited=inherited)}
Conditional

這個預定義特性標記了一個條件方法,其執行依賴於指定的預處理識別符號它會引起方法呼叫的條件編譯,取決於指定的值,比如Debug或Trace.例如,當除錯程式碼時顯示變數的值。

規定該特性的語法如下:

[Conditional(
   conditionalSymbol
)]

例如:
[Conditional("DEBUG")]

Obsolete

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

[Obsolete(
   message
)]

[Obsolete(
   message,
   iserror
)]

引數message,是一個字串,描述專案為什麼過時的原因以及該替代是用什麼。

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

建立自定義特性(Attribute)

.Net框架允許建立自定義特性,用於儲存宣告性資訊,且可在執行時被檢索,該資訊根據設計標準和程式需要,可與任何目標元素相關。

建立並使用自定義特性包含四個步驟

宣告自定義特性。構建自定義特性、在目標程式元素上應用自定義特性、通過反射訪問自定義特性。

宣告自定義特性:

一個新的自定義特性應派生自System.Attribute類。例如:

// 一個自定義特性 BugFix 被賦給類及其成員
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]

public class DeBugInfo : System.Attribute
構建自定義

// 一個自定義特性 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;
      }
  }
}

C#中利用Conditional定義條件方法

利用conditional屬性,程式設計師可以定義條件方法。conditional屬性通過測試條件編譯符號來確定適用的條件。當執行到一個條件方法呼叫時,是否執行該呼叫,要根據出現該呼叫時是否已定義了此符號來確定。如果定義了此符號,則執行該呼叫;否則省略該呼叫(包括對呼叫的引數的計算)。使用Conditional是封閉#if和#endif內部方法的替代方法,它更整潔、更別緻、減少了出錯的機會。

條件方法要受到以下限制:

條件方法必須是類宣告或結構宣告中的方法。如果在介面宣告中的方法指定Conditional屬性,將出現編譯時錯誤。

條件方法必須具有返回型別。

不能用override修飾符標記條件方法。但是可以用virtual修飾符標記條件方法。此類方法的重寫方法隱含為有條件的方法,而且不能用Conditional屬性顯式標記。

條件方法不能是介面方法的實現。否則將發生編譯時錯誤。

如果條件方法用在委託建立表示式中,也會發生編譯時錯誤。

這裡需要注意的是:如果建立一個沒有定義任何條件的方法,那麼預設只要呼叫就總是會執行此方法,如果你想通過條件判斷來執行,那麼該方法上必須至少包含一個conditional特性所包含的條件,他才會響應你定義的條件。