直接或間接繼承自System.Attribute的類是Attribute,按照約定,屬性的名字應該帶一個Attribute的尾碼,當然不帶也不會引起編譯時間的錯誤,只不過需要注意的是以下內容using System;
[AttributeUsage(AttributeTargets.All)]
public class XAttribute: Attribute
{}
[X] // Refers to XAttribute
class Class1 {}
[XAttribute] // Refers to XAttribute
class Class2 {}
[@X] // Error: no attribute named "X"
class Class3 {}
看過上面的代碼應該知道了,@可以去掉二義性.還有一點,[XAttribute]是沒有二義性的,即使還有個屬性叫做[XAttributeAttribute].
另一個內容是關於Attribute的參數的,它可以有兩類參數位置參數(Positional Parameters)和具名引數(Named Parameters).見如下代碼using System;
[AttributeUsage(AttributeTargets.Class)]
public class HelpAttribute: Attribute
{
public HelpAttribute(string url) { // Positional parameter
}
public string Topic { // Named parameter
get {}
set {}
}
public string Url {
get {}
}
}
每一個共有的執行個體(不是static)構造器都可以定義一系列位置參數,而非靜態可讀寫欄位和屬性可以定義具名引數.
三個保留的屬性:
1.System.AttributeUsageAttribute 用來定義屬性使用的方式.被該屬性修飾的類必須是直接或者間接繼承自System.Attribute,否則將會有編譯時間錯誤.有一個枚舉類型的位置參數AttributeTargets,表示定義的屬性可以應用到什麼身上.兩個具名引數AllowMultiple (代表該屬性是否可以多次用在統一對象上)和Inherited (表示當該屬性用到基類的時候,該屬性是否會自動添加到衍生類別上).
2.System.Diagnostics.ConditionalAttribute 用來標誌一個條件方法,通過測試編譯條件來決建立一個條件.是否調用被標記屬性ConditionalAttribute 的方法,取決於在調用的地方(不是被調用的地方)是否有編譯條件.這個屬性有一個位置參數string conditionString表示條件.條件方法有如下限制:
a)條件屬性只能定義在類或者結構的方法上,如果定義在介面的方法上就會有編譯錯誤.
b)條件屬性只能定義在傳回型別為void的方法上.
C)條件屬性不能用在用override修飾的方法上.條件屬性可以應用於有virtual的方法上,並且隱含地應用於重載該方法的方法上,但不能顯式地定義某個用override修飾的方法.
d)條件屬性也不能應用於實現介面的方法的方法上.否則將引發編譯時間錯誤(條件成員**方法不能實現介面**方法).
3.System.Obsolete 用來表徵一個類型或者一個類型的成員不再使用了.該屬性有三個執行個體建構函式,於是有三個位置參數定位序列.其中最多的有兩個參數string message(當用戶端代碼調用這個類型或者類型的成員時的提示資訊, bool error(預設為false當代碼被注釋時為警告,如果為ture則顯示為編譯錯誤)