91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET基礎編程之特性 - Attribute

發布時間:2020-06-13 20:37:05 來源:網絡 閱讀:628 作者:IT大贏家 欄目:編程語言

  這一篇文章是給大家介紹的是:.NET基礎編程之特性 - Attribute,對這一部分掌握不熟悉的同學,可以仔細的看一下!

      一、特性簡介

  特性提供功能強大的方法,用以將元數據或聲明信息與代碼(程序集、類型、方法、屬性等)相關聯。特性與程序實體關聯后,可在運行時使用“反射”查詢特性。

  特性具有以下屬性:

  (1)特性可向程序中添加元數據。元數據是有關在程序中定義的類型的信息。所有的 .NET 程序集都包含指定的一組元數據,這些元數據描述在程序集中定義的類型和類型成員。可以添加自定義特性,以指定所需的任何附加信息。

  (2)可以將一個或多個特性應用到整個程序集、模塊或較小的程序元素(如類和屬性)。

  (3)特性可以與方法和屬性相同的方式接受參數。

  (4)程序可以使用反射檢查自己的元數據或其他程序內的元數據。

  二、使用特性

  特性可以放置在幾乎所有的聲明中(但特定的特性可能限制在其上有效的聲明類型)。在 C# 中,特性的指定方法為:將括在方括號中的特性名置于其應用到的實體的聲明上方。它必須位于所應用于的元素的緊前面并與該元素在同一行。

  [Serializable] //使用特性 SerializableAttribute

  internal class MyClass

  {

  [DllImport("user32.dll")] //使用特性 DllImportAttribute

  private static extern void Do();

  #region 一個聲明上可放置多個特性

  private void MethodA([In][Out]ref double n) { }

  private void MethodB([In, Out]ref double n) { }

  #endregion 一個聲明上可放置多個特性

  #region 某些特性對于給定實體可以指定多次

  [Conditional("DEBUG"), Conditional("TEST1")]

  private void TraceMethod() { }

  #endregion 某些特性對于給定實體可以指定多次

  }

  【注意】根據約定,所有特性名稱都以單詞“Attribute”結束,以便將它們與“.NET Framework”中的其他項區分。但是,在代碼中使用特性時,不需要指定 attribute 后綴。

  三、特性的參數

  許多特性都有參數,而這些參數可以是定位參數、未命名參數或命名參數。任何定位參數都必須按特定順序指定并且不能省略,而命名參數是可選的且可以按任意順序指定。首先指定定位參數。例如,這三個特性是等效的:

  [DllImport("user32.dll")]

  [DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]

  第一個參數(DLL 名稱)是定位參數并且總是第一個出現,其他參數為命名參數。在這種情況下,兩個命名參數均默認為 false,因此可將其省略。

  四、特性的目標

  特性的目標是應用該特性的實體。例如,特性可以應用于類、特定方法或整個程序集。默認情況下,特性應用于它后面的元素。但是,您也可以顯式標識要將特性應用于方法還是它的參數或返回值。

  若

  要顯式標識特性目標,語法:

  [target : attribute-list]

  .NET基礎編程之特性 - Attribute

  //示例:將特性應用于程序集和模塊[assembly: AssemblyTitle("assembly 4.6.1")]

  [module: CLSCompliant(true)]

  //示例:將特性應用于方法、方法參數和方法返回值

  //默認:應用于方法

  [SomeAttr]

  int Method1() { return 0; }

  //指定應用于方法

  [method: SomeAttr]

  int Method2() { return 0; }

  //指定應用于返回值

  [return: SomeAttr]

  int Method3() { return 0; }

  五、特性的常見用途

  以下列表包含特性的幾個常見用途:

  (1)在 Web 服務中,使用 WebMethod 特性來標記方法,以指示該方法應該可通過 SOAP 協議進行調用。

  (2)描述當與本機代碼進行交互操作時如何封送方法參數。有關更多信息。

  (3)描述類、方法和接口的 COM 屬性。

  (4)使用 DllImportAttribute 類調用非托管代碼。

  (5)在標題、版本、說明或商標方面描述您的程序集。

  (6)描述要持久性序列化類的哪些成員。

  (7)描述如何映射類成員和 XML 節點以便進行 XML 序列化。

  (8)描述方法的安全要求。

  (9)指定用于強制安全性的特性。

  (10)由實時 (JIT) 編譯器控制優化,以便易于調試代碼。

  (11)獲取有關調用方的信息的方法。

  六、創建自定義的特性

  通過定義一個特性類,可以創建您自己的自定義特性。該特性類直接或間接地從 Attribute 派生,有助于方便快捷地在元數據中標識特性定義。

  ///

  /// 角色特性

  ///

  /// RoleAttribute:特性的名稱,繼承 Attribute,為自定義特性

  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]

  public class RoleAttribute : Attribute

  {

  private string _name;

  ///

  /// 啟用標識

  ///

  /// IsEnable:命名參數

  public bool IsEnable { get; set; }

  ///

  /// 構造函數

  ///

  ///

  /// name:定位參數

  public RoleAttribute(string name)

  {

  _name = name;

  }

  }

  [Role("Me", IsEnable = true)] //調用特性的方式

  public class OurClass

  {

  }

  構造函數的參數是自定義特性的定位參數,任何公共的讀寫字段或屬性都是命名參數。

  【注意】 AttributeUsage 特性,在這里它使得 Role 特性僅在類和 struct 聲明中有效。

  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)]  //AllowMultiple:該值指示能否為一個程序多次使用該特性

  public class RoleAttribute : Attribute

  {

  //... ...

  }

  [Role("You")]            //在同一個類上多次使用

  [Role("Me", IsEnable = true)]

  public class OurClass

  {

  //... ...

  }

  注意:如果特性類包含一個屬性,則該屬性必須為讀寫屬性。

  七、使用反射訪問特性

  使用反射,可檢索用自定義特性定義的信息。

  主要方法是GetCustomAttributes,它返回對象數組,這些對象在運行時等效于源代碼特性。

  ///

  /// 角色特性

  ///

  /// RoleAttribute:特性的名稱,繼承 Attribute,為自定義特性

  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]

  public class RoleAttribute : Attribute

  {

  private string _name;

  ///

  /// 啟用標識

  ///

  public bool IsEnable { get; set; }

  ///

  /// 構造函數

  ///

  ///

  public RoleAttribute(string name)

  {

  _name = name;

  }

  }

  RoleAttribute.cs

  [Role("Me", IsEnable = true)]

  public class OurClass

  {

  //... ...

  }

  概念上等效于

  RoleAttribute role = new RoleAttribute("Me");

  role.IsEnable = true;

  但是,直到查詢 OurClass 來獲取特性后才會執行此代碼。對 OurClass 調用 GetCustomAttributes 會導致按上述方式構造并初始化一個 RoleAttribute 對象。如果該類具有其他特性,則按相似的方式構造其他特性對象。

  然后 GetCustomAttributes 返回 RoleAttribute 對象和數組中的任何其他特性對象。之后就可以對此數組進行迭代,確定根據每個數組元素的類型所應用的特性,并從特性對象中提取信息。

  這里,定義一個自定義特性,將其應用于若干實體并通過反射進行檢索。

  ///

  /// 角色特性

  ///

  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)]

  public class RoleAttribute : Attribute

  {

  private readonly string _name;

  ///

  /// 啟用標識

  ///

  public bool IsEnable { get; set; }

  ///

  /// 構造函數

  ///

  ///

  public RoleAttribute(string name)

  {

  _name = name;

  }

  public string GetName()

  {

  return _name;

  }

  }

  class MyClass1 { }

  [Role("Me")]

  class MyClass2 { }

  [Role("Me"), Role("You", IsEnable = true)]

  class MyClass3 { }

  class Program

  {

  static void Main(string[] args)

  {

  Output(typeof(MyClass1));

  Output(typeof(MyClass2));

  Output(typeof(MyClass3));

  Console.Read();

  }

  ///

  /// 輸出

  ///

  ///

  static void Output(Type t)

  {

  Console.WriteLine($"Class: {t}");

  var attributes = t.GetCustomAttributes();

  foreach (var attribute in attributes)

  {

  var attr = attribute as RoleAttribute;

  if (attr == null)

  {

  return;

  }

  Console.WriteLine($" Name: {attr.GetName()}, IsEnable: {attr.IsEnable}");

  }

  }

  }

  .NET基礎編程之特性 - Attribute


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南华县| 彭州市| 镇原县| 东丽区| 平利县| 汝城县| 乌拉特后旗| 嘉善县| 武陟县| 万年县| 夏邑县| 平安县| 达日县| 临泽县| 麻江县| 通山县| 临猗县| 娱乐| 绥阳县| 奉化市| 新巴尔虎右旗| 宝坻区| 高淳县| 双峰县| 昌吉市| 曲阳县| 唐河县| 天柱县| 高尔夫| 同仁县| 固阳县| 满洲里市| 闵行区| 宣城市| 慈利县| 美姑县| 全州县| 东平县| 云霄县| 东城区| 渭源县|