C#——擴充套件方法
2016年11月24日 00:39:59 賈文靜 閱讀數:2866
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/jiadajing267/article/details/53314190
前提
小編最近正在準備面試,也想在.NET平臺上更進一步,趁著面試複習了一些知識,同時也收穫到一些新的知識——擴充套件方法就是其中之一。小編會通過一個Demo展示擴充套件方法的用法,以及對比它給我們帶來的好處!
定義
先說一個熟悉的內容,LINQ表示式,其實它就是擴充套件方法的一種體現。Msdn上介紹C#中的擴充套件方法——擴充套件方法使您能夠向現有型別“新增”方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。
Demo
1、不使用擴充套件方法
-
//**********************************************
-
// 文 件 名:Program
-
// 名稱空間:$rootnamespace$
-
// 內 容:
-
// 功 能:
-
// 檔案關係:
-
// 作 者:賈文靜
-
// 生成日期:2016/11/23 21:22:23
-
// 版 本 號:V1.0.0.0
-
// 修改日誌:
-
// 版權說明:
-
//**********************************************
-
using System;
-
using System.Collections.Generic;
-
using System.Linq;
-
using System.Text;
-
namespace extendfunction
-
{
-
class Program
-
{
-
static void Main(string[] args)
-
{
-
List<string> persons = new List<string>();
-
persons.Add("zhang san");
-
persons.Add("zhang san feng");
-
persons.Add("li si ");
-
persons.Add("wang wu");
-
persons.Add("wang liu");
-
persons.Add("li ba");
-
persons.Add("lao wu");
-
persons.Add("zhang xx");
-
var result = from p in persons select p;
-
expand ex = new expand();
-
ex.Print(result);
-
Console.ReadLine();
-
}
-
public class expand
-
{
-
public void Print(IEnumerable<string> ie)
-
{
-
IEnumerator<string> result = ie.GetEnumerator();
-
while (result.MoveNext())
-
{
-
Console.WriteLine(result.Current);
-
}
-
}
-
}
-
}
2、使用擴充套件方法
-
//**********************************************
-
// 文 件 名:Program
-
// 名稱空間:$rootnamespace$
-
// 內 容:
-
// 功 能:
-
// 檔案關係:
-
// 作 者:賈文靜
-
// 生成日期:2016/11/23 21:22:23
-
// 版 本 號:V1.0.0.0
-
// 修改日誌:
-
// 版權說明:
-
//**********************************************
-
using System;
-
using System.Collections.Generic;
-
using System.Linq;
-
using System.Text;
-
namespace extendfunction
-
{
-
class Program
-
{
-
static void Main(string[] args)
-
{
-
List<string> persons = new List<string>();
-
persons.Add("zhang san");
-
persons.Add("zhang san feng");
-
persons.Add("li si ");
-
persons.Add("wang wu");
-
persons.Add("wang liu");
-
persons.Add("li ba");
-
persons.Add("lao wu");
-
persons.Add("zhang xx");
-
var result = from p in persons select p;
-
result.Print();
-
Console.ReadLine();
-
}
-
}
-
#region 擴充套件方法
-
public static class ExtraClass
-
{
-
public static void Print(this IEnumerable<string> ie)
-
{
-
IEnumerator<string> result = ie.GetEnumerator();
-
while (result.MoveNext())
-
{
-
Console.WriteLine(result.Current);
-
}
-
}
-
}
-
#endregion
-
}
擴充套件方法的書寫格式
說說擴充套件方法的格式吧。從上面的demo上不知道大家能不能看出點什麼東西來?它是在靜態類中定義了靜態方法,然後在函式第一個引數必須使用this來修飾,之後的內容和我們寫普通方法基本一致,所以說也是非常容易上手的。
使用拓展方法的優點
從簡單程度上來說,使用擴充套件方法明顯比使用傳統方式要簡單很多,不需要例項化,修改方法也不需要重新修改和編譯。
那為什麼擴充套件方法沒有得到很大的推廣呢?(不足之處)
1、是靜態方法,使用不當會造成“汙染”;
2、不具有override的能力,不會過載原有的方法
3、擴充套件方法會被擴充套件類的同名方法覆蓋,所以實現擴充套件方法我們需要承擔隨時被覆蓋的風險
4、擴充套件方法不能訪問被擴充套件類的私有成員
5、擴充套件方法只能用例項來呼叫,不能像普通的靜態方法一樣使用類名呼叫;
6、只有引入擴充套件方法所在的名稱空間後,擴充套件方法才可以使用。
擴充套件方法的本質
1、將例項方法呼叫在編譯期改變為靜態類中的靜態方法呼叫,實際上,它確實擁有靜態方法所有具有的所有功能。
2、作用域是整個namespace可見的,並通過使用using namespace來匯入其他名稱空間中的擴充套件方法。
3、優先順序:現有例項方法優先順序最高,其次為最近的namespace下的靜態類的靜態方法,最後為較遠的namespace下的靜態類的靜態方法。
4、是一種編譯技術,注意與反射等執行時技術進行區別,並慎重使用。
【總結】
關於擴充套件方法學習起來還是非常簡單的,容易上手易操作,所以敲個小Demo還是非常容易的,這個擴充套件方法使用起來非常的符合開閉原則,但是靜態方法有讓它多了一些危險性,所以真正想要使用擴充套件方法的時候還是需要考慮均衡。當然面對LINQ語句就不用擔心,畢竟這是封裝過得,用起來還是非常簡單的。