C# 是一種命令式語言,但像所有命令式語言一樣,它具有某些聲明性元素。例如,通過將類中的方法聲明為 public
、protected
、internal
、protected internal
或 private
,指定它的可訪問性。C# 使此功能一般化,以便程序員可以創造出一種新的聲明性信息,將此聲明性信息附加到各種程序實體,並在運行時檢索此聲明性信息。程序通過定義和使用屬性(第 17 節)來描述這類額外的聲明性信息。
例如,一個框架也許會定義一個可放置在程序元素(如類和方法)上的 HelpAttribute
屬性,使開發人員能夠提供從程序元素到其文檔的映射。示例
using System; [AttributeUsage(AttributeTargets.All)] public class HelpAttribute: Attribute { public HelpAttribute(string url) { this.url = url; } public string Topic = null; private string url; public string Url { get { return url; } } }
定義了一個名為 HelpAttribute
的屬性類,它具有一個定位參數 (string url
) 和一個命名參數 (string Topic
)。正如第 17.1 節中所解釋的,該屬性可以通過它的完整名稱 HelpAttribute
或通過它的隱式簡稱 Help
引用。定位參數由該屬性類的公共實例構造函數的形參定義,命名參數則由屬性類的公共非靜態讀寫字段和對應的屬性定義。
示例
[Help("http://www.microsoft.com/.../Class1.htm")] public class Class1 { [Help("http://www.microsoft.com/.../Class1.htm", Topic = "F")] public void F() {} }
顯示 Help
屬性的幾種用法。
在運行時可以利用反射支持檢索給定程序元素的屬性信息。示例
using System; class Test { static void Main() { Type type = typeof(Class1); object[] arr = type.GetCustomAttributes(typeof(HelpAttribute), true); if (arr.Length == 0) Console.WriteLine("Class1 has no Help attribute."); else { HelpAttribute ha = (HelpAttribute) arr[0]; Console.WriteLine("Url = {0}, Topic = {1}", ha.Url, ha.Topic); } } }
檢查 Class1
是否具有 Help
屬性,如果具有該屬性,則寫出關聯的 Topic
和 Url
值。