天天看點

Linq之擴充方法

<a href="http://www.cnblogs.com/wolf-sun/p/4216256.html#t1" target="_blank">寫在前面</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4216256.html#t2" target="_blank">系列文章</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4216256.html#t3" target="_blank">擴充方法</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4216256.html#t4" target="_blank">總結</a>

上篇文章介紹了隐式類型,自動屬性,初始化器,匿名類的相關概念,及通過反編譯的方式檢視了編譯器幫我們做了那些事。本篇文章将介紹擴充方法的知識點,及如何定義,如何使用的相關内容。

<a href="http://www.cnblogs.com/wolf-sun/p/4199383.html">linq之lambda表達式初步認識</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4206982.html">linq之lambda進階</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4214164.html">linq之隐式類型、自動屬性、初始化器、匿名類</a>

擴充方法使你能夠向現有類型“添加”方法,而無需建立新的派生類型、重新編譯或以其他方式修改原始類型。 擴充方法是一種特殊的靜态方法,但可以像擴充類型上的執行個體方法一樣進行調用。 

最常見的擴充方法是 linq 标準查詢運算符,它将查詢功能添加到現有的 system.collections.ienumerable 和 system.collections.generic.ienumerable&lt;t&gt; 類型。 若要使用标準查詢運算符,請先使用 using system.linq 指令将它們置于範圍中。 然後,任何實作了 ienumerable&lt;t&gt; 的類型看起來都具有 groupby、orderby、average 等執行個體方法。 在 ienumerable&lt;t&gt; 類型的執行個體(如 list&lt;t&gt; 或 array)後鍵入“dot”時,可以在 intellisense 語句完成中看到這些附加方法。

首先看一下啊,擴充方法漲什麼樣子

Linq之擴充方法

通過上圖可以發現,擴充方法所在的類必須是靜态類,方法必須為靜态方法,并且方法第一個參數必須以this修飾符開始。

如何自定義擴充方法?

1.定義一個靜态類以包含擴充方法。 該類必須對用戶端代碼可見。  2.将該擴充方法實作為靜态方法,并使其至少具有與包含類相同的可見性。 3.該方法的第一個參數指定方法所操作的類型;該參數必須以 this 修飾符開頭。 4.在調用代碼中,添加一條 using 指令以指定包含擴充方法類的命名空間。 5.按照與調用類型上的執行個體方法一樣的方式調用擴充方法。 請注意,第一個參數不是由調用代碼指定的,因為它表示正應用運算符的類型,并且編譯器已經知道對象的類型。 您隻需通過 n 為這兩個形參提供實參。

 一個例子

為string擴充這樣一個方法:傳回字元串的位元組數。在項目中添加一個這樣的類stringextension

Linq之擴充方法
Linq之擴充方法

在使用時,首先引入你的擴充方法所在的靜态類所在命名空間,比如在這個例子中,需要引入

 然後你就可以這樣來用,就好比你定義的這個方法就是string類中定義的一樣。

Linq之擴充方法

通過代碼也發現這樣的問題,擴充方法,在無法修改源代碼的情況下,提供了一種為該類來添加行為的方式。比如在這裡咱們無法修改string類的源代碼,也不可能在string類的方法中添加一個getbyteslength的方法,但是通過擴充方法,在用戶端使用的時候,就好比,這個方法就是string類的方法一樣。

 在滑鼠放在方法名上時,也會提示該方法是擴充方法,如圖

Linq之擴充方法

輸出結果

Linq之擴充方法

1、擴充方法為靜态方法,所在的類必須為靜态類,方法第一個參數必須以this修飾符開頭。

2、擴充方法在使用的時,必須能夠通路到。

3、在使用時需引入擴充方法所在的命名空間。(當然你也可以直接使用要擴充的類型的命名空間,比如string類型的命名空間為system,你可以使用system作為stringextension的命名空間,這樣使用的時候不需要引入命名空間了。但一般不建議這樣做!)

參考文章

msdn:http://msdn.microsoft.com/zh-cn/library/bb383977.aspx

         http://msdn.microsoft.com/zh-cn/library/bb311042.aspx

部落格位址:

<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>

部落格版權:

本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。

如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!

再次感謝您耐心的讀完本篇文章。http://www.cnblogs.com/wolf-sun/p/4216256.html

繼續閱讀