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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java 中模擬 C# 的擴充套件方法JavaC#套件
- .NET: 談談C#中的擴充套件方法C#套件
- C#中的擴充套件類的理解C#套件
- 【JavaScript框架封裝】使用Prototype給Array,String,Function物件的方法擴充JavaScript框架封裝Function物件
- C#學習筆記-方法引數、擴充套件方法C#筆記套件
- Json擴充套件方法JSON套件
- LINQ擴充套件方法套件
- C#學習筆記(補充)——擴充套件方法、事件C#筆記套件事件
- c# 高階應用 理解擴充套件方法C#套件
- Java 缺失的特性:擴充套件方法Java套件
- android view 擴充套件方法AndroidView套件
- Flutter——Dart Extension擴充套件方法的使用FlutterDart套件
- 再學Blazor——擴充套件方法Blazor套件
- sql中的擴充套件學習SQL套件
- .Net Core AutoMapper自定義擴充套件方法的使用APP套件
- tonyenc加密擴充套件使用方法加密套件
- 【SpringBoot】分析 SpringBoot 中的擴充套件點Spring Boot套件
- C# 反射呼叫擴充類方法C#反射
- shell中擴充套件命令套件
- C#|.net core 基礎 - 擴充套件陣列新增刪除效能最好的方法C#套件陣列
- ES6物件的擴充套件及新增方法。物件套件
- 兩個簡單的擴充套件方法:TrimPrefix和TrimSuffix套件
- ES6 -- String 擴充套件方法解析套件
- es6 陣列擴充套件方法陣列套件
- PHP中的MySQLi擴充套件學習(二)mysqli類的一些少見的屬性方法PHPMySql套件
- 讀構建可擴充套件分散式系統:方法與實踐15可擴充套件系統的基本要素套件分散式
- Spring 中的 XML schema 擴充套件機制SpringXML套件
- 聊聊Spring中的那些擴充套件機制Spring套件
- MySQL中InnoDB引擎對索引的擴充套件MySql索引套件
- Minecraft中ScoreBoard的底層實現與擴充套件應用Raft套件
- solaris11怎麼擴充套件資源池?solaris11擴充套件資源池的方法套件
- 熱更學習筆記10~11----lua呼叫C#中的List和Dictionary、擴充類中的方法筆記C#
- PHP 容器中安裝原始碼包中的擴充套件PHP原始碼套件
- python使用ctypes呼叫擴充套件模組的例項方法Python套件
- JavaScript權威指南(11)——JavaScript的子集和擴充套件JavaScript套件
- C#開源實用的工具類庫,整合超過1000多種擴充套件方法C#套件
- 給IConfiguration寫一個GetAppSetting擴充套件方法APP套件
- Spring(11) - Introductions進行類擴充套件方法Spring套件
- (精華)2020年6月26日 C#類庫 Enum(擴充套件方法)C#套件