與命令式程式設計相比,宣告式程式設計用更簡單、清楚方法描述軟體行為。宣告式程式設計即用宣告定義程式行為,而非寫指令。C# 中(如大多數語言),大多數程式是命令式:在程式中寫方法定義行為。C# 中用特性即宣告式程式設計。添加特性到類別、屬性、資料成員、方法,.NET 執行期為你添加行為。宣告目的:簡單易用、易讀、易維護。
寫第一個 ASP.NET Web 服務時,精靈產生:
[WebMethod]
public string HelloWorld() { return "Hello World"; }
VS.NET Web 服務精靈添加 [WebMethod] 特性到 HelloWorld(),定義其為 Web 方法。ASP.NET 執行期為你產生程式碼回應此特性:產生 WSDL 文件描述 SOAP 調用 HelloWorld;支援執行期發送 SOAP 請求;動態產生 HTML 頁面讓你在 IE 測試。全部皆 WebMethod 特性回應。特性宣告意圖,執行期確保支援。使用特性省時、少錯。
非神話。ASP.NET 執行期用反射斷定類別中哪些方法是 Web 服務,發現時添加必要框架程式碼,使任何添加程式碼的方法成為 Web 方法。
[WebMethod] 只是 .NET 類庫眾多特性之一,幫助更快建立正確程式。有些特性幫助建立可序列化型別(原則 25)。原則 4 特性控制條件編譯。這些情況下,宣告式程式設計寫出更快、少錯程式碼。
應用 .NET 框架自帶特性宣告意圖,比自己寫好:花費時間少、更簡單、編譯器不會出錯。
若內建特性不適合需求,可定義自有特性並用反射用宣告式結構。範例:建立特性關聯程式碼,讓使用者用特性建立預設可排序型別。示範如何添加特性,定義客戶集合排序方式:
[DefaultSort("Name")]
public class Customer
{
public string Name { get { return _name; } set { _name = value; } }
public decimal CurrentBalance { get { return _balance; } }
public decimal AccountValue { get { return calculateValueOfAccount(); } }
}
DefaultSort 特性、Name 屬性,暗示任何 Customer 集合應以客戶名字排序。DefaultSort 非 .NET 框架一部分,為實現它,建立 DefaultSortAttribute 類別:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class DefaultSortAttribute : System.Attribute
{
private string _name;
public string Name { get { return _name; } set { _name = value; } }
public DefaultSortAttribute(string name) { _name = name; }
}