C 中的擴充套件方法詳解

2022-09-26 08:24:10 字數 3995 閱讀 5864

擴充套件方法使你能夠向現有型別「新增」方法,而無需建立dezevgimo新的派生型別、重新編譯或以其他方式修改原始型別。 擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。 以上是msdn官網對擴充套件方法的描述,現在我通過乙個情景例子來對此進行闡釋。假設乙個控制台程式class program{}裡面的主函式如下:

static void main(string args)

假設需求變了,日期的顯示格式要變成"yyyy-mm-dd"這種格式,當然只需要初始化time時按下面寫法改寫即可:

string time = now.tostring("yyyy-mm-dd");

但是如果要改變日期格式的有很多個類呢?每個都要改一次嗎?這樣一旦需求變來變去就忙死人了。傳統的解決方式是封裝乙個幫助類,在裡面寫方法,然後供其他類呼叫。

本例在當前專案模仿新增乙個datehelper類:public class datehelper{},在類裡面定義方法:

public static string datetostring(datetime dt)

於是原來的主函式改寫如下:

static void main(string args)

此時如果變需求,只需要改寫datehelp類裡的datetostring()方法就行了,不管有多少個類呼叫此方法,都會被影響。問題解決了,可是這樣要呼叫另乙個類的方法,還是有點麻煩,有沒有什麼方法能夠讓我們像now.datetostring()一樣直接呼叫呢?當然datetime是微軟寫好的,我們改不了,無法建立想要的例項方法,於是,便引出了擴充套件方法。

下面是擴充套件方法的要素:

1.此方法必須是乙個靜態方法

2.此方法必須放在靜態類中

3.此方法的第乙個引數必須以this開頭,並且指定此方法是擴充套件自哪個型別

根據以上要素,我們datehelper類改成靜態類:public static class datehelper{} ,同時改寫datetostring()方法:

public static string datetostring(this datetime dt)

此時回到主函式方法體,輸入"now."便可以看見自動提示有個datetostring()方法,於是**可以這樣寫:

static void main(string args)

顯而易見,這樣用起來會更加便捷,而且這樣讓我們看起來確實就像是被擴充套件型別本身具有的例項方法一樣,可讀性很高。下面概括一下擴充套件方法的特點:

1.擴充套件方法擴充套件自哪個型別,就必須是此型別的變數來使用,其他型別無法使用,本例擴充套件自datetime型別,就只能是被datetime型別的變數.出來(now.datetostring())

2.擴充套件方法中的this後面的引數不屬於方法的引數,本例是無引數,this後面的datetime dt是指明擴充套件方法擴充套件自何種型別

3.如果擴充套件方法和例項方法具有相同的簽名,則優先呼叫例項方法

4.擴充套件自父類上的方法,可以被子類的物件直接使用

5.擴充套件自介面上的方法,可以被實現類的物件直接使用

6.擴充套件方法最終還是被編譯器編譯成:靜態類.靜態方法(),本例中now.datetostring()最終還是dezevgimo會被編譯成datehelper.datetostring(now),這是它的本質

實際上,我們可能會遇到這樣的情景,如在介面擴充套件乙個方法的時候,所有的原本已實現該介面的類都要實現新擴充套件的方法,這樣的改動是乙個很麻煩的工作,可以使用擴充套件方法「曲線救國」;而有時候我們想為某個類新增新方法卻不想改動這個類,那麼擴充套件方法這種「偽新增」方法的方式就體現出它的價值了。最常見的擴充套件方法是linq標準查詢運算子,運用廣泛,這種方便快捷的方式理應博得碼農們點1024個讚。

「擴充套件方法使您能夠向現有型別「新增」方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。」

這是msdn上說的,也就是你可以對string,int,datarow,datatable等這些型別的基礎上增加乙個或多個方法,使用時不需要去修改或編譯型別本身的**。

先做個例子吧,以string為例,需要在字串型別中加乙個從字串轉為數值的功能。

以往我們可能是這樣做的,會專門寫乙個方法做過轉換

public static int strtoint(string s)

呼叫就使用

string s = "abc";

int i = strtoint(s);

若是string型別有乙個名為toint()(從字串轉為數值)的方法,就可以這樣呼叫了

string s = "abc";

int i = s.toint();

這樣看起來是不是更好,下面來看看具體怎麼實現吧

第一步:

我先建立乙個解決方案,乙個web應用程式(webtest)及乙個類庫(w.common)

在webtest專案新增引用w.common專案

第二步:在類庫中新建乙個名為estring.cs類

using system;

using system.collections.generic;

using system.linq;

using system.text;

namespace w.common

}}看了上面的**了吧,擴充套件方法規定類必須是乙個靜態類,estring是乙個靜態類,裡面包含的所有方法都必須是靜態方法。

msdn是這樣規定擴充套件方法的:「擴充套件方法被定義為靜態方法,但它們是通過例項方法語法進行呼叫的。 它們的第乙個引數指定該方法作用於哪個型別,並且該參www.cppcns.com數以 this 修飾符為字首。」

estring裡有乙個toint的靜態方法,他接收乙個自身引數this,型別為string,this string必須在方法引數的第乙個位置。

這句話什麼意思,即你需要對string擴充套件乙個toint方法,this是string例項化後的物件,這可能說的不太清楚,我的表述能力能弱,不要見怪呀。。。通俗的說就是,擴充套件方法跟靜態類的名稱無關,只需要在乙個靜態類裡面定義乙個靜態方法,第乙個引數必須this string開頭。

如果需要你要對datetime型別擴充套件方法名為isrange(判斷是否在此時間範圍內),**如下:

///

/// 此時間是否在此範圍內 -1:小於開始時間 0:在開始與結束時間範圍內 1:已超出結束時間

///

///

///

///

///

public static int isrange(this datetime t, datetime starttime, datetime endtime)

if (((endtime - t).totalseconds < 0))

return 0;

}這裡的擴充套件方法是用this datetime打頭,那麼就可以這樣呼叫

time.isrange(t1,t2);//判斷時間time是否在t1到t2的範圍內

當前**在使用擴充套件方法前需要先引用命名空間

using system;

using system.collections.generic;

using system.linq;

using system.web;

using system.web.ui;

using system.web.ui.webcontrols;

using w.common;//這裡引用擴充套件方法所在的命名空間

namespace webtest

///

/// 沒有用擴充套件方法

///

private void use1()

///

/// 使用擴充套件方法

///

private void use2()

public static int strtoint(string s)

}}以上是我對擴充套件方法理解及使用,如有不對或不足的地方請多多指正,謝謝啦。。

這我第一次寫文章算是排過版的,用好長時間呀,以前都只是看別人的文章,現在才知道寫一篇好的文章真的不容易呀。

努力學習,堅持自己的夢想。

本文標題: c#中的擴充套件方法詳解

本文位址:

C 的擴充套件方法詳解

必須是靜態類才可以新增擴充套件方法 static class program 宣告擴充套件方法 擴充套件方法必須是靜態的,add有三個引數 this 必須有,string表示我要擴充套件的型別,stringname表示物件名 三個引數this和擴充套件的型別必不可少,物件名可以自己隨意取如果需要傳遞...

c 擴充套件方法詳解

擴充套件方法被定義為靜態方法,但它們是通過例項方法語法進行呼叫的。它們的第乙個引數指定該方法作用於哪個型別,並且該引數以 this 修飾符為字首。擴充套件方法當然不能破壞物件導向封裝的概念,所以只能是訪問所擴充套件類的public成員。擴充套件方法使您能夠向現有型別 新增 方法,而無需建立新的派生型...

C 中的擴充套件方法

c 中的擴充套件方法用來為現有型別新增方法,以擴充套件現有的型別,這些型別可以是基本的資料型別 如int string等 也可以是自己定義的型別。擴充套件方法是通過指定關鍵字this修飾方法的第乙個引數而宣告的。擴充套件方法只可以宣告在靜態類中。以下為擴充套件基本型別string public st...