C#
C# 擴充方法的介紹與實例
2018/12/31 15:39:03
0
9093
C# 擴充方法的介紹與實例
簡介 |
C# 提供了擴充方法這個功能,它可以讓我們可以不在原本類別中加入新增方法,而是透過一個靜態類別裡的靜態方法去實作想要的功能。 |
作者 |
陳光堯 |
在實作 C# 專案裡,時常可以看到擴充方法的影子。例如以下這個例子,names 定義了 5 個人名的字串陣列,我們想要找出開頭為「A」的人名出來,所以在實作上使用 Where 這個方法,但事實上 names 字串陣列並沒有定義這個方法,那麼這個方法是怎麼來的呢?

若進一步把滑鼠游標移到 Where 上面,可以看到 IDE 工具給我們的提示訊息,上面寫著「(擴充功能)」的字樣,其實這個 Where 方法是定義在 System.Linq 命名空間內的擴充方法,而且是針對字串陣列所設計的。經由這個例子,可以想見在程式裡會經常使用到擴充方法並且廣泛應用在我們的需求上。

C# 提供了擴充方法 (extension method) 這個功能,它可以讓我們可以不在原本類別中加入新增方法,而是透過一個靜態類別裡的靜態方法去實作想要的功能。因為這種設計方式,原本類別不會有任何修改,所以也就不會重新編譯,所以在設計上,只要把心力專注於有實作擴充方法的程式即可。
以下用一個簡單的例子來介紹如何實作擴充方法。首先在專案加入 Person 類別,裡面記錄著簡單的客戶資料(身分證號碼、姓名、生日及居住地),假設現在有個需求需要分析客戶的性別,年齡及居住縣市,我們一開始可能會把這個需求寫成一個方法並且定義在 Person 類別裡,但擴充方法可以讓我們不用修改 Person 類別原本的程式之下,也可以增加需求要的功能。

在專案底下再增加一個名稱叫 ExtensionMethod 的類別,並且定義此類別為靜態類別 (static class),然後在此靜態類別內定義三個靜態方法 (static method),方法主體就是分別取得性別、年齡及居住縣市的資料,此外這個靜態方法需要一個方法參數,其型別要是 Person 類別,型別前面再加上 this 關鍵字,說明此擴充方法是套用在哪一個型別上的擴充功能,如下圖。

接著在主程式 Program.cs 撰寫以下的程式來應證之前的實作是否正確。

------------------------------------------------------------------------------------------------------------------------------------------

在主程式裡,利用 Person 類別的建構子建立了一個實體 (instance),然後分別呼叫 GetGender()、GetAge() 及 GetCountry() 這三個方法,但這些方法在原本 Person 類別並沒有定義,卻可以正常去呼叫,這個就是擴充方法,針對 Person 類別額外增加的功能。

------------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------------
對於擴充方法做了以下的結論與整理:
1. 擴充方法其實是定義在一個靜態類別的靜態方法。
2. 擴充方法需要定義一個參數,其型別決定此擴充方法要套用在哪一個型別上。
3. 擴充方法與一般的靜態方法不同處在於擴充方法定義的第一個參數型別前需加上 this 關鍵字。
4. 擴充方法在設計上雖然是靜態的方式定義,但卻是要透過類別實體化後再去呼叫的。