C# 擴(kuò)展方法的使用
譯文鏈接:https://www.infoworld.com/art...

C# 在 3.0 版本中提供了對(duì) 擴(kuò)展方法 的支持,擴(kuò)展方法常用于給一個(gè)已存在的類(lèi)添加新的方法從而擴(kuò)展該類(lèi)的功能,最關(guān)鍵的是:你不需要在現(xiàn)存類(lèi)中派生一個(gè)子類(lèi),你也不需要破壞性的修改類(lèi)的現(xiàn)有代碼骨架,更談不上重新編譯了,擴(kuò)展方法能夠提供代碼的可讀性同時(shí)又可以擴(kuò)展類(lèi)的功能。
.NET 框架中最常見(jiàn)的擴(kuò)展方法包括 Linq 標(biāo)準(zhǔn)的查詢操作,這類(lèi)擴(kuò)展方法極大的擴(kuò)展了System.Collections.IEnumerable 和 System.Collections.Generic.IEnumerable<T> 的查詢能力,如下圖:

現(xiàn)在你明白了擴(kuò)展方法,你可以用這項(xiàng)技術(shù)去給已存在的 class 或者 interface 添加更多實(shí)用方法而不應(yīng)該從子類(lèi)中新增額外的方法,MSDN上說(shuō):擴(kuò)展方法允許你給現(xiàn)有的類(lèi) 添加 方法,而不需要你生成子類(lèi),重新編譯,或者任何其他形式的修改原有類(lèi),擴(kuò)展方法是一種特殊的靜態(tài)方法,當(dāng)你調(diào)用它的時(shí)候就好像它就是你擴(kuò)展類(lèi)的原生方法。
本質(zhì)上來(lái)說(shuō),擴(kuò)展方法也算是一種特殊的靜態(tài)方法,它允許你給已存在的類(lèi)添加新的方法即使你沒(méi)有權(quán)限訪問(wèn)這個(gè)擴(kuò)展類(lèi)的源代碼,擴(kuò)展方法除了簽名中的第一個(gè)參數(shù)是 this 之外就和靜態(tài)方法是一模一樣,你可以給任何一個(gè)類(lèi)添加任意多的擴(kuò)展方法,更🐂👃的是:這個(gè)擴(kuò)展方法特性還可以作用到值類(lèi)型之上。
當(dāng)你使用擴(kuò)展方法的時(shí)候,請(qǐng)記住下面的幾個(gè)點(diǎn):
- 擴(kuò)展方法必須是一個(gè)靜態(tài)方法
- 擴(kuò)展方法必須在 static class 內(nèi),類(lèi)的名字無(wú)所謂
- 擴(kuò)展方法的第一個(gè)參數(shù)一定是 this,后面跟上你需要擴(kuò)展的類(lèi)型
有一點(diǎn)要特別注意,如果擴(kuò)展方法的名字和你要擴(kuò)展類(lèi)中的某一個(gè)方法重名了,那么你的擴(kuò)展方法將會(huì)失效,永遠(yuǎn)也不會(huì)被調(diào)用。
使用 C# 擴(kuò)展方法
這一節(jié)中我們一起探討下如何使用 C# 來(lái)實(shí)現(xiàn)一個(gè)擴(kuò)展方法,下面的代碼清單展示了 C# 中的擴(kuò)展方法到底長(zhǎng)成什么樣?
public static class StringExtensions
{
public static bool IsNumeric(this string str)
{
double output;
return double.TryParse(str, out output);
}
}
請(qǐng)注意擴(kuò)展方法中的第一個(gè)參數(shù),正如之前討論過(guò)的,任何擴(kuò)展方法都必須是靜態(tài)的,而且在參數(shù)之前還要申明一下 this 關(guān)鍵詞,比如像上面這個(gè)例子一樣,相當(dāng)于告訴了編譯器你已經(jīng)在 string 類(lèi)上擴(kuò)展了一個(gè) IsNumeric 方法。
接下來(lái)一起看一下如何在 string 類(lèi)中使用 IsNumeric 方法。
static void Main(string[] args)
{
string str = "100";
if (str.IsNumeric()) Console.WriteLine("The string object named str contains numeric value.");
Console.Read();
}
當(dāng)你執(zhí)行完上面這段程序,會(huì)在控制臺(tái)輸出:The string object named str contains numeric value。
你可以使用擴(kuò)展方法這門(mén)技術(shù)通過(guò)向類(lèi)添加方法的形式增強(qiáng)類(lèi)的功能,而不需要修改,派生或者重新編譯原來(lái)的類(lèi)型,正如之前我提到的,擴(kuò)展方法也可以應(yīng)用于值類(lèi)型之上,接下來(lái)我通過(guò)一個(gè)例子來(lái)驗(yàn)證下這是如何實(shí)現(xiàn)的。
下面我定義了一個(gè) IntegerExtensions 類(lèi),里面有一個(gè) IsEven 擴(kuò)展方法,當(dāng)輸入的參數(shù)是偶數(shù)的話,這個(gè)方法會(huì)返回 true,否則返回 false。
public static class IntegerExtensions
{
public static bool IsEven(this int i)
{
return ((i % 2) == 0);
}
}
接下來(lái)的代碼將會(huì)展示如何在 integer 類(lèi)型上調(diào)用這個(gè)擴(kuò)展方法。
static void Main(string[] args)
{
int n = 2;
if (n.IsEven()) Console.WriteLine("The value of the integer is even.");
}
更多高質(zhì)量干貨:參見(jiàn)我的 GitHub: dotnetfly
以上就是C# 擴(kuò)展方法的使用的詳細(xì)內(nèi)容,更多關(guān)于c# 擴(kuò)展方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#找不到類(lèi)型名"SqlConnection"的有效解決方法
最近在使用c#鏈接SqlServer的時(shí)候遇到了錯(cuò)誤,通過(guò)查找相關(guān)資料終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于C#找不到類(lèi)型名"SqlConnection"的有效解決方法,需要的朋友可以參考下2023-02-02
C#實(shí)例化和靜態(tài)類(lèi)對(duì)象調(diào)用對(duì)比
這篇文章主要介紹了C#實(shí)例化和靜態(tài)類(lèi)對(duì)象調(diào)用對(duì)比,什么時(shí)候用實(shí)例化對(duì)象,什么時(shí)候用靜態(tài)類(lèi)對(duì)象,內(nèi)存和生命周期又是如何,框架本身的回收機(jī)制是什么,下文詳細(xì)解說(shuō)需要的小伙伴可以參考一下2022-04-04
C#中結(jié)構(gòu)體定義并轉(zhuǎn)換字節(jié)數(shù)組詳解
在寫(xiě)C#TCP通信程序時(shí),發(fā)送數(shù)據(jù)時(shí),只能發(fā)送byte數(shù)組,處理起來(lái)比較麻煩不說(shuō),如果是和VC6.0等寫(xiě)的程序通信的話,很多的都是傳送結(jié)構(gòu)體,在VC6.0中可以很方便的把一個(gè)char[]數(shù)組轉(zhuǎn)換為一個(gè)結(jié)構(gòu)體,而在C#卻不能直接把byte數(shù)組轉(zhuǎn)換為結(jié)構(gòu)體,要在C#中發(fā)送結(jié)構(gòu)體,應(yīng)該怎么做呢?2017-11-11
C#中將xml文件反序列化為實(shí)例時(shí)采用基類(lèi)還是派生類(lèi)的知識(shí)點(diǎn)討論
在本篇文章里小編給大家整理的是關(guān)于C#中將xml文件反序列化為實(shí)例時(shí)采用基類(lèi)還是派生類(lèi)的知識(shí)點(diǎn)討論,有需要的朋友們學(xué)習(xí)下。2019-11-11
C#實(shí)現(xiàn)Base64處理的加密解密,編碼解碼示例
這篇文章主要介紹了C#實(shí)現(xiàn)Base64處理的加密解密,編碼解碼,結(jié)合實(shí)例形式分析了基于C#實(shí)現(xiàn)的base64編碼解碼操作相關(guān)技巧,需要的朋友可以參考下2017-01-01
解析C#中委托的同步調(diào)用與異步調(diào)用(實(shí)例詳解)
本篇文章是對(duì)C#中委托的同步調(diào)用與異步調(diào)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#遞歸遍歷窗體所有textbox控件并設(shè)置textbox事件的方法
這篇文章主要介紹了C#遞歸遍歷窗體所有textbox控件并設(shè)置textbox事件的方法,包括針對(duì)textbox控件的遞歸遍歷技巧與事件方法的設(shè)置技巧,需要的朋友可以參考下2014-12-12

