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

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

現(xiàn)在你明白了擴展方法,你可以用這項技術(shù)去給已存在的 class 或者 interface 添加更多實用方法而不應該從子類中新增額外的方法,MSDN上說:擴展方法允許你給現(xiàn)有的類 添加 方法,而不需要你生成子類,重新編譯,或者任何其他形式的修改原有類,擴展方法是一種特殊的靜態(tài)方法,當你調(diào)用它的時候就好像它就是你擴展類的原生方法。
本質(zhì)上來說,擴展方法也算是一種特殊的靜態(tài)方法,它允許你給已存在的類添加新的方法即使你沒有權(quán)限訪問這個擴展類的源代碼,擴展方法除了簽名中的第一個參數(shù)是 this 之外就和靜態(tài)方法是一模一樣,你可以給任何一個類添加任意多的擴展方法,更🐂👃的是:這個擴展方法特性還可以作用到值類型之上。
當你使用擴展方法的時候,請記住下面的幾個點:
- 擴展方法必須是一個靜態(tài)方法
- 擴展方法必須在 static class 內(nèi),類的名字無所謂
- 擴展方法的第一個參數(shù)一定是 this,后面跟上你需要擴展的類型
有一點要特別注意,如果擴展方法的名字和你要擴展類中的某一個方法重名了,那么你的擴展方法將會失效,永遠也不會被調(diào)用。
使用 C# 擴展方法
這一節(jié)中我們一起探討下如何使用 C# 來實現(xiàn)一個擴展方法,下面的代碼清單展示了 C# 中的擴展方法到底長成什么樣?
public static class StringExtensions
{
public static bool IsNumeric(this string str)
{
double output;
return double.TryParse(str, out output);
}
}
請注意擴展方法中的第一個參數(shù),正如之前討論過的,任何擴展方法都必須是靜態(tài)的,而且在參數(shù)之前還要申明一下 this 關(guān)鍵詞,比如像上面這個例子一樣,相當于告訴了編譯器你已經(jīng)在 string 類上擴展了一個 IsNumeric 方法。
接下來一起看一下如何在 string 類中使用 IsNumeric 方法。
static void Main(string[] args)
{
string str = "100";
if (str.IsNumeric()) Console.WriteLine("The string object named str contains numeric value.");
Console.Read();
}
當你執(zhí)行完上面這段程序,會在控制臺輸出:The string object named str contains numeric value。
你可以使用擴展方法這門技術(shù)通過向類添加方法的形式增強類的功能,而不需要修改,派生或者重新編譯原來的類型,正如之前我提到的,擴展方法也可以應用于值類型之上,接下來我通過一個例子來驗證下這是如何實現(xiàn)的。
下面我定義了一個 IntegerExtensions 類,里面有一個 IsEven 擴展方法,當輸入的參數(shù)是偶數(shù)的話,這個方法會返回 true,否則返回 false。
public static class IntegerExtensions
{
public static bool IsEven(this int i)
{
return ((i % 2) == 0);
}
}
接下來的代碼將會展示如何在 integer 類型上調(diào)用這個擴展方法。
static void Main(string[] args)
{
int n = 2;
if (n.IsEven()) Console.WriteLine("The value of the integer is even.");
}
更多高質(zhì)量干貨:參見我的 GitHub: dotnetfly
以上就是C# 擴展方法的使用的詳細內(nèi)容,更多關(guān)于c# 擴展方法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于數(shù)據(jù)類型轉(zhuǎn)換(裝箱與拆箱)與常量詳解
下面小編就為大家分享一篇基于數(shù)據(jù)類型轉(zhuǎn)換(裝箱與拆箱)與常量詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
Unity讀取Excel文件轉(zhuǎn)換XML格式文件
這篇文章主要為大家詳細介紹了Unity讀取Excel文件轉(zhuǎn)換XML格式文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06
C#結(jié)合OpenCVSharp4實現(xiàn)圖片相似度識別
這篇文章主要為大家詳細介紹了C#如何結(jié)合OpenCVSharp4實現(xiàn)圖片相似度識別,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下2023-09-09
C#使用String和StringBuilder運行速度測試及各自常用方法簡介
今天小編就為大家分享一篇關(guān)于C#使用String和StringBuilder運行速度測試及各自常用方法簡介,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
解析從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動態(tài)擴容機制的詳解
本篇文章是對從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動態(tài)擴容機制進行了詳細的分析介紹,需要的朋友參考下2013-05-05
C#利用Label標簽控件模擬窗體標題的移動及窗體顏色不斷變換效果
Label標簽控件相信對大家來說都不陌生,下面這篇文章主要給大家介紹了關(guān)于C#利用Label標簽控件模擬窗體標題的移動及窗體顏色不斷變換效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。2017-12-12
c# 9.0新特性nint和Pattern matching的使用方法
這篇文章主要介紹了c# 9.0新特性nint和Pattern matching的使用方法,文中講解非常細致,幫助你更好的學習c# 9.0,有需求的朋友可以參考下2020-06-06

