1. 程式人生 > >C#——擴充套件方法

C#——擴充套件方法

2016年11月24日 00:39:59 賈文靜 閱讀數:2866

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/jiadajing267/article/details/53314190

前提

    小編最近正在準備面試,也想在.NET平臺上更進一步,趁著面試複習了一些知識,同時也收穫到一些新的知識——擴充套件方法就是其中之一。小編會通過一個Demo展示擴充套件方法的用法,以及對比它給我們帶來的好處!

定義

    先說一個熟悉的內容,LINQ表示式,其實它就是擴充套件方法的一種體現。Msdn上介紹C#中的擴充套件方法——擴充套件方法使您能夠向現有型別“新增”方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。

也就是對String,Int,DataRow,DataTable等這些型別的基礎上新增一個或多個方法,而不需要去修改或者編譯型別本身。

Demo

1、不使用擴充套件方法

  1. //**********************************************

  2. // 文 件 名:Program

  3. // 名稱空間:$rootnamespace$

  4. // 內 容:

  5. // 功 能:

  6. // 檔案關係:

  7. // 作 者:賈文靜

  8. // 生成日期:2016/11/23 21:22:23

  9. // 版 本 號:V1.0.0.0

  10. // 修改日誌:

  11. // 版權說明:

  12. //**********************************************

  13. using System;

  14. using System.Collections.Generic;

  15. using System.Linq;

  16. using System.Text;

  17. namespace extendfunction

  18. {

  19. class Program

  20. {

  21. static void Main(string[] args)

  22. {

  23. List<string> persons = new List<string>();

  24. persons.Add("zhang san");

  25. persons.Add("zhang san feng");

  26. persons.Add("li si ");

  27. persons.Add("wang wu");

  28. persons.Add("wang liu");

  29. persons.Add("li ba");

  30. persons.Add("lao wu");

  31. persons.Add("zhang xx");

  32. var result = from p in persons select p;

  33. expand ex = new expand();

  34. ex.Print(result);

  35. Console.ReadLine();

  36. }

  37. public class expand

  38. {

  39. public void Print(IEnumerable<string> ie)

  40. {

  41. IEnumerator<string> result = ie.GetEnumerator();

  42. while (result.MoveNext())

  43. {

  44. Console.WriteLine(result.Current);

  45. }

  46. }

  47. }

  48. }

2、使用擴充套件方法

  1. //**********************************************

  2. // 文 件 名:Program

  3. // 名稱空間:$rootnamespace$

  4. // 內 容:

  5. // 功 能:

  6. // 檔案關係:

  7. // 作 者:賈文靜

  8. // 生成日期:2016/11/23 21:22:23

  9. // 版 本 號:V1.0.0.0

  10. // 修改日誌:

  11. // 版權說明:

  12. //**********************************************

  13. using System;

  14. using System.Collections.Generic;

  15. using System.Linq;

  16. using System.Text;

  17. namespace extendfunction

  18. {

  19. class Program

  20. {

  21. static void Main(string[] args)

  22. {

  23. List<string> persons = new List<string>();

  24. persons.Add("zhang san");

  25. persons.Add("zhang san feng");

  26. persons.Add("li si ");

  27. persons.Add("wang wu");

  28. persons.Add("wang liu");

  29. persons.Add("li ba");

  30. persons.Add("lao wu");

  31. persons.Add("zhang xx");

  32. var result = from p in persons select p;

  33. result.Print();

  34. Console.ReadLine();

  35. }

  36. }

  37. #region 擴充套件方法

  38. public static class ExtraClass

  39. {

  40. public static void Print(this IEnumerable<string> ie)

  41. {

  42. IEnumerator<string> result = ie.GetEnumerator();

  43. while (result.MoveNext())

  44. {

  45. Console.WriteLine(result.Current);

  46. }

  47. }

  48. }

  49. #endregion

  50. }

擴充套件方法的書寫格式

    說說擴充套件方法的格式吧。從上面的demo上不知道大家能不能看出點什麼東西來?它是在靜態類中定義了靜態方法,然後在函式第一個引數必須使用this來修飾,之後的內容和我們寫普通方法基本一致,所以說也是非常容易上手的。

使用拓展方法的優點

    從簡單程度上來說,使用擴充套件方法明顯比使用傳統方式要簡單很多,不需要例項化,修改方法也不需要重新修改和編譯。

那為什麼擴充套件方法沒有得到很大的推廣呢?(不足之處)

1、是靜態方法,使用不當會造成“汙染”;

2、不具有override的能力,不會過載原有的方法

3、擴充套件方法會被擴充套件類的同名方法覆蓋,所以實現擴充套件方法我們需要承擔隨時被覆蓋的風險

4、擴充套件方法不能訪問被擴充套件類的私有成員

5、擴充套件方法只能用例項來呼叫,不能像普通的靜態方法一樣使用類名呼叫;

6、只有引入擴充套件方法所在的名稱空間後,擴充套件方法才可以使用。

擴充套件方法的本質

1、將例項方法呼叫在編譯期改變為靜態類中的靜態方法呼叫,實際上,它確實擁有靜態方法所有具有的所有功能。

2、作用域是整個namespace可見的,並通過使用using namespace來匯入其他名稱空間中的擴充套件方法。

3、優先順序:現有例項方法優先順序最高,其次為最近的namespace下的靜態類的靜態方法,最後為較遠的namespace下的靜態類的靜態方法。

4、是一種編譯技術,注意與反射等執行時技術進行區別,並慎重使用。

【總結】

    關於擴充套件方法學習起來還是非常簡單的,容易上手易操作,所以敲個小Demo還是非常容易的,這個擴充套件方法使用起來非常的符合開閉原則,但是靜態方法有讓它多了一些危險性,所以真正想要使用擴充套件方法的時候還是需要考慮均衡。當然面對LINQ語句就不用擔心,畢竟這是封裝過得,用起來還是非常簡單的。