特性具備如下屬性:
-
特性可向程序中添加元數據。 元數據是有關在程序中定義的類型的信息。 全部的 .NET 程序集都包含指定的一組元數據,這些元數據描述在程序集中定義的類型和類型成員。 能夠添加自定義特性,以指定所需的任何附加信息。 有關更多信息,請參見 建立自定義特性(C# 和 Visual Basic)。node
-
能夠將一個或多個特性應用到整個程序集、模塊或較小的程序元素(如類和屬性)。程序員
-
特性能夠與方法和屬性相同的方式接受參數。web
-
程序可使用反射檢查本身的元數據或其餘程序內的元數據。 有關更多信息,請參見 使用反射訪問特性(C# 和 Visual Basic)。數組
使用特性
特性能夠放置在幾乎全部的聲明中(但特定的特性可能限制在其上有效的聲明類型)。 在 C# 中,特性的指定方法爲:將括在方括號中的特性名置於其應用到的實體的聲明上方。 在 Visual Basic 中,特性括在尖括號 (< >) 內。 它必須位於所應用於的元素的緊前面並與該元素在同一行。安全
在本例中,使用特性 SerializableAttribute 將特定特徵應用於類:app
[System.Serializable] public class SampleClass { // Objects of this type can be serialized. }
具備 DllImportAttribute 特性的方法的聲明以下:less
using System.Runtime.InteropServices; ... [System.Runtime.InteropServices.DllImport("user32.dll")] extern static void SampleMethod();
一個聲明上可放置多個特性:dom
using System.Runtime.InteropServices; ... void MethodA([In][Out] ref double x) { } void MethodB([Out][In] ref double x) { } void MethodC([In, Out] ref double x) { }
某些特性對於給定實體能夠指定屢次。 例如,ConditionalAttribute 就是一個可屢次使用的特性:ide
[Conditional("DEBUG"), Conditional("TEST1")] void TraceMethod() { // ... }
注意 |
---|
根據約定,全部特性名稱都以單詞「Attribute」結束,以便將它們與「.NET Framework」中的其餘項區分。 可是,在代碼中使用特性時,不須要指定 attribute 後綴。 例如,[DllImport] 雖等效於 [DllImportAttribute],但 DllImportAttribute 纔是該特性在 .NET Framework 中的實際名稱。函數 |
特性參數
許多特性都有參數,而這些參數能夠是定位參數、未命名參數或命名參數。 任何定位參數都必須按特定順序指定而且不能省略,而命名參數是可選的且能夠按任意順序指定。 首先指定定位參數。 例如,這三個特性是等效的:
[DllImport("user32.dll")] [DllImport("user32.dll", SetLastError=false, ExactSpelling=false)] [DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
第一個參數(DLL 名稱)是定位參數而且老是第一個出現,其餘參數爲命名參數。 在這種狀況下,兩個命名參數均默認爲 false,所以可將其省略。 有關默認參數值的信息,請參考各個特性的文檔。
特性目標
特性的目標是應用該特性的實體。 例如,特性能夠應用於類、特定方法或整個程序集。 默認狀況下,特性應用於它後面的元素。 可是,您也能夠顯式標識要將特性應用於方法仍是它的參數或返回值。
若要顯式標識特性目標,請使用下面的語法:
[target : attribute-list]
下表顯示了可能的 target 值的列表。
C# |
Visual Basic |
適用對象 |
---|---|---|
assembly |
Assembly |
整個程序集 |
module |
Module |
當前程序集模塊(不一樣於 Visual Basic 模塊) |
field |
不支持 |
在類或結構中的字段 |
event |
不支持 |
event |
method |
不支持 |
方法或 get 和 set 屬性訪問器 |
param |
不支持 |
方法參數或 set 屬性訪問器參數 |
property |
不支持 |
Property |
return |
不支持 |
方法、屬性索引器或 get 屬性訪問器的返回值 |
type |
不支持 |
結構、類、接口、枚舉或委託 |
下面的示例演示如何將特性應用於程序集和模塊。 有關更多信息,請參見 經常使用特性(C# 和 Visual Basic)。
using System; using System.Reflection; [assembly: AssemblyTitleAttribute("Production assembly 4")] [module: CLSCompliant(true)]
下面的示例演示如何在 C# 中將特性應用於方法、方法參數和方法返回值。
// default: applies to method [SomeAttr] int Method1() { return 0; } // applies to method [method: SomeAttr] int Method2() { return 0; } // applies to return value [return: SomeAttr] int Method3() { return 0; }
注意 |
---|
不管規定 SomeAttr 應用於什麼目標,都必須指定 return 目標,即便 SomeAttr 被定義爲僅應用於返回值也是如此。 換言之,編譯器將不使用 AttributeUsage 信息解析不明確的特性目標。 有關更多信息,請參見 AttributeUsage(C# 和 Visual Basic)。 |
特性的常見用途
如下列表包含特性的幾個常見用途:
-
在 Web 服務中,使用 WebMethod 特性來標記方法,以指示該方法應該可經過 SOAP 協議進行調用。 有關更多信息,請參見 WebMethodAttribute。
-
描述當與本機代碼進行交互操做時如何封送方法參數。 有關更多信息,請參見 MarshalAsAttribute。
-
描述類、方法和接口的 COM 屬性。
-
使用 DllImportAttribute 類調用非託管代碼。
-
在標題、版本、說明或商標方面描述您的程序集。
-
描述要持久性序列化類的哪些成員。
-
描述如何映射類成員和 XML 節點以便進行 XML 序列化。
-
描述方法的安全要求。
-
指定用於強制安全性的特性。
-
由實時 (JIT) 編譯器控制優化,以便易於調試代碼。