C#中的this擴充套件方法與javascript中的prototype方法

iDotNetSpace發表於2009-02-11

this擴充套件方法是在Dotnet3.0中加入的一種新特性.

"擴充套件方法使您能夠向現有型別“新增”方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。對於用 C# 和 Visual Basic 編寫的客戶端程式碼,呼叫擴充套件方法與呼叫在型別中實際定義的方法之間沒有明顯的差異。最常見的擴充套件方法是 LINQ 標準查詢運算子,這些運算子在現有 System.Collections..::.IEnumerable 和 System.Collections.Generic..::.IEnumerable)>) 型別中新增了查詢功能。若要使用這些標準查詢運算子,請先使用 using System.Linq 指令將它們納入範圍中。然後,任何實現了 IEnumerable)>) 的型別看起來都具有 GroupBy、OrderBy、Average 等例項方法。......"

"通常,建議您只在不得已的情況下才實現擴充套件方法,並謹慎地實現。只要有可能,必須擴充套件現有型別的客戶端程式碼都應該通過建立從現有型別派生的新型別來達到這一目的"

摘自MSDN介紹:http://msdn.microsoft.com/zh-cn/library/bb383977.aspx

 


我們暫且先不管MSDN的注意事項,我們關注的是這種方法和javascript中原型方法的異同.

 


舉例:去除字串中的所有空格


例子本身特簡單,直接上程式碼

 


C#版本_傳統寫法:

首先定義一個trimStrTrad方法,程式碼如下


public static string trimStrTrad(string SourceStr)

{

      return Regex.Replace(SourceStr, @"\s", "");

}

在每次需要去除字串空格的時候,呼叫此方法,如:

var strA = " aa bb   ccc ";

trimStrTrad(strA);

 


javascript版本_傳統寫法:

過程同上,無需贅述.


下面,我們看一下擴充套件方法是如何實現的.

在認識上,我對javascript的原型要早於C#的擴充套件方法,先演示js版本的.

 


javascript版本:


String.prototype.trimStr = function(){

      return this.replace(/\s/g, "");

};

使用方法:var strA=" aa bb   ccc ";strA.trimStr();

 


C#版本

 public static string trimStr(this string sourceStr)

 {

      return Regex.Replace(sourceStr, @"\s", "");           

 }

使用方法:其實和javascript版本的是一模一樣的: var strA=" aa bb   ccc ";strA.trimStr();

 


2種版本的功能是一樣的,就是string這個類新增一個擴充套件方法,使得所有這個類的例項化物件能夠直接使用這個方法.對於javascript來說,這種方式我們用的習慣了,也就不覺得有什麼了,但是C#的這種實現方式也算是一種改進.這也是一種趨勢吧,很多動態語言的崛起,使得傳統的靜態語言也在追求更便捷的使用方式.

 


下面我們來試著解決一下實際的一個問題:


實際問題:假如在國外某公司的系統中有一個person類,程式碼如下:

    public  class Person

    {

        private string _name = "Noname";

        private int _age = 1;


        public string name

        {

            get { return this._name; }

            set { this._name = value; }

        }


        public int age

        {

            get { return this._age; }

            set { this._age=value; }

        }       

    }

 


如果我們想取得其中的年齡,可以這樣做:

var p=new Person();

var age=p.age;


現在我們要呼叫這套系統,而中國說年齡的時候,基本上都是說虛歲,我們應該怎麼辦呢?

原來的處理方式就是單獨寫一個處理函式,在年齡上加1就可以了,但是,這段程式碼看著就是不舒服.這就正好用到了this擴充套件方法.我們可以在擴充套件中新增一個虛歲來滿足要求.

//計算虛歲

        public static int nominalage(this Person p)

        {

            return p.age + 1;

      }


然後就可以下面這樣使用了:

    var p=new Person();

  var age=p.nominalage();//此處是擴充套件方法,並不是屬性

 

 

上面已經說過,c#的這種this擴充套件方法和javascript中的prototype方法很類似,但就現在來說,this擴充套件方法是在學習prototype方法,因為在javascript中prototype的功能要遠比這強大的多,也可以說prototype威力更大,也希望廣大Dotnet程式設計師多學習一下其他語言,只有對比學習,才能收穫更多.

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-548715/,如需轉載,請註明出處,否則將追究法律責任。

相關文章