C#中的this擴充套件方法與javascript中的prototype方法
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- .NET: 談談C#中的擴充套件方法C#套件
- Java 中模擬 C# 的擴充套件方法JavaC#套件
- C#中的擴充套件類的理解C#套件
- C#基礎系列:擴充套件方法的使用C#套件
- JavaScript String 物件擴充套件方法JavaScript物件套件
- C# 擴充套件方法 借籤於 Objective-C 擴充套件類.C#套件Object
- C#學習筆記-方法引數、擴充套件方法C#筆記套件
- Java 缺失的特性:擴充套件方法Java套件
- 五、談擴充套件方法的理解套件
- C#學習筆記(補充)——擴充套件方法、事件C#筆記套件事件
- c# 高階應用 理解擴充套件方法C#套件
- C#新特性:匿名類和擴充套件方法C#套件
- 【JavaScript框架封裝】使用Prototype給Array,String,Function物件的方法擴充JavaScript框架封裝Function物件
- Json擴充套件方法JSON套件
- LINQ擴充套件方法套件
- Flutter——Dart Extension擴充套件方法的使用FlutterDart套件
- sql中的擴充套件學習SQL套件
- STL中的棧的擴充套件 (轉)套件
- 來看看兩種好玩的方法,擴充套件方法和分部方法套件
- 分享.NET系統開發過程中積累的擴充套件方法套件
- Unity3D引擎擴充套件中的編輯器定製方法Unity3D套件
- 再學Blazor——擴充套件方法Blazor套件
- C#.NET擴充套件方法C#套件
- android view 擴充套件方法AndroidView套件
- redis的PHP擴充套件包安裝方法RedisPHP套件
- shell中擴充套件命令套件
- linux下線上擴大擴充套件分割槽的方法Linux套件
- tonyenc加密擴充套件使用方法加密套件
- CheckBoxList擴充套件方法程式碼套件
- 關於給apache新增PHP擴充套件的方法ApachePHP套件
- MySQL中InnoDB引擎對索引的擴充套件MySql索引套件
- C# 反射呼叫擴充類方法C#反射
- Minecraft中ScoreBoard的底層實現與擴充套件應用Raft套件
- PHP 容器中安裝原始碼包中的擴充套件PHP原始碼套件
- PHP中的MySQLi擴充套件學習(二)mysqli類的一些少見的屬性方法PHPMySql套件
- C#|.net core 基礎 - 擴充套件陣列新增刪除效能最好的方法C#套件陣列
- es6 陣列擴充套件方法陣列套件
- .Net3.5新特性-擴充套件方法套件