程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則24:選擇申明式編程而不是命令式編程(1)

Effective C#原則24:選擇申明式編程而不是命令式編程(1)

編輯:關於C語言

與命令式編程相比,申明式編程可以用更簡單,更清楚的方法來描述軟件的 行為。申明式編程就是說用申明來定義程序的行為,而不是寫一些指令。在C#裡 ,也和其它大多數語言一樣,你的大多數程序都是命令式的:在程序中寫一個方 法來定義行為。在C#中,你在編程時使用特性就是申明式編程。你添加一個特性 到類,屬性,數據成員,或者是方法上,然後.Net運行時就會為你添加一些行為 。這樣申明的目的就是簡單易用,而且易於閱讀和維護。

讓我們以一個 你已經使用過的例子開始。當你寫你的第一個ASP.Net Web服務時,向導會生成 這樣的代碼:

[WebMethod]
public string HelloWorld()
{
 return "Hello World";
}

VS.net的Web服務向導添加了[WebMethod]特性到HelloWorld()方 法上,這就定義了HelloWorld是一個web方法。ASP.net運行時會為你生成代碼來 響應這個特性。運行時生成的Web服務描述語言(WSDL)文檔,也就是包含了對 SOAP進行描述的文檔,調用HelloWorld方法。ASP.net也支持運行時發送SOAP請 求HelloWorld方法。另外,ASP.Net運行時動態的生成Html面頁,這樣可以讓你 在IE裡測試你的新Web服務。而這些全部是前面的WebMethod特性所響應的。這個 特性申明了你的意圖,而且運行時確保它是被支持的。使用特性省了你不少時間 ,而且錯誤也少了。

這並不是一個神話,ASP.net運行時使用反射來斷定 類裡的哪些方法是web服務,當它們發現這些方法時,ASP.Net運行時就添加一些 必須的框架代碼到這些方法上,從而使任何添加了這些代碼的方法成為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特性,Nane屬性,這就暗示了任何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;
 }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved