C#特性
特性(
Attribute
)是用于在運作時傳遞程式中各種元素(比如類、方法、結構、枚舉、元件等)的行為資訊的聲明性标簽。
特性(
Attribute
)用于添加中繼資料,如編譯器指令和注釋、描述、方法、類等其他資訊。中繼資料是程式中定義的類型的相關資訊。 所有 .NET 程式集都包含一組指定的中繼資料,用于描述程式集中定義的類型和類型成員。 可以添加自定義特性來指定所需的其他任何資訊
.NET架構中一些預定義的特性
-
-标記某個type過時了Obsolete
-
-公開WebMethod
方法WebService
-
-表示某個類可以被序列化Serializable
Obsolete
的使用參考Part 52 - C# Tutorial - Attributes in C#
例如,可以使用
Obsolete
标記某個方法已經過時了,提示其使用新的方法代替
[Obsolete("Use Add(List<int> Numbers) instead")]
public static int Add(int FirstNumber, int SecondNumber)
Obsolete
還有一個屬性
error
,指定為
true
的話,就不是警告了,而是錯誤,甚至不能編譯程式
[Obsolete("Use Add(List<int> Numbers) instead", true)]
public static int Add(int FirstNumber, int SecondNumber)
AttributeUsage
參考:
- C# 特性(Attribute)
- AttributeUsage (C#)
AttributeUsage
是 AttributeUsageAttribute 的别名。
預定義特性
AttributeUsage
描述了如何使用一個自定義特性類。它規定了特性可應用到的項目的類型。
[System.AttributeUsage(System.AttributeTargets.All,
AllowMultiple = false,
Inherited = true)]
class NewAttribute : System.Attribute { }
參數的含義:
-
-規定特性可被放置的語言元素。預設是AttributeUsage
。必須是 AttributeTargets 枚舉的一個或多個元素。 可将多個目标類型與 OR 運算符連結在一起,如下所示:AttributeTargets.All
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] class NewPropertyOrFieldAttribute : Attribute { }
-
-如果為 true,則該特性是多用的。預設值是 false(單用的)AllowMultiple
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] class MultiUseAttr : Attribute { } [MultiUseAttr] [MultiUseAttr] class Class1 { } [MultiUseAttr, MultiUseAttr] class Class2 { }
-
-如果為 true,則該特性可被派生類繼承。預設值是 false(不被繼承)inherited
自定義特性
參考:
- 建立自定義特性 (C#)
- C# 特性(Attribute)
可通過定義特性類建立自己的自定義特性,特性類是直接或間接派生自 Attribute 的類,可快速輕松地識别中繼資料中的特性定義。
建立并使用自定義特性包含四個步驟:
- 聲明自定義特性
- 建構自定義特性
- 在目标程式元素上應用自定義特性
- 通過反射通路特性
自定義
Author
特性類
[System.AttributeUsage(System.AttributeTargets.Class |
System.AttributeTargets.Struct)
]
public class Author : System.Attribute
{
private string name;
public double version;
public Author(string name)
{
this.name = name;
version = ;
}
}
使用
AttributeUsage
特性可使
Author
特性僅對類和
struct
聲明有效。
可按如下方式使用這一新特性:
[Author("P. Ackerman", version = )]
class SampleClass
{
// P. Ackerman's code goes here...
}