C 中的擴充套件方法學習總結

2021-07-08 16:06:06 字數 2557 閱讀 5001

擴充套件方法從字面上理解是指擴充套件的方法,而對應到物件導向程式設計這個格局中則是指為乙個類提供的擴充套件方法。按照我們通常的理解,我們首先需要獲得某個類的源**,然後在這個類**中增加成員方法,這樣就可以達到為乙個類提供擴充套件方法的目的。可是不幸地是,這種方法在沒有源**的情況下就無法奏效了,而且我們人為地去改變源**有可能會破壞整個**的穩定性。那麼有沒有一種方法能在不改變源**的前提下為某個類提供擴充套件方法呢?這就是我們今天要說的擴充套件方法,所以我們可以將擴充套件方法理解為在不改變源**的前提下向外部提供擴充套件方法的一種方式。c#中的擴充套件方法實現起來是相對來說比較簡單的,例如我們做在unity3d遊戲開發的時候,可能會用到dotween這個外掛程式。這個外掛程式是itween的作者重新編寫乙個動畫外掛程式,效率上比itween有較大的提公升。更為重要的一點是,它採用擴充套件方法這種實現方式,使得我們在呼叫這些api介面的時候難以感覺到我們是在使用乙個外掛程式,更像是在使用unity3d的原生函式,所以當我們使用dotween + ugui 這樣的組合的時候,內心會感到無比的舒暢,一切都像是水到渠成一般。

擴充套件方法在實現上和普通的物件導向程式設計是一樣的,換句話說,我們只需要定義乙個類,然後在裡面新增並實現相應的方法即可。但是這裡需要注意的地方有三點,第一,實現擴充套件方法的類必須是靜態類且類的名稱和實現擴充套件方法的類無關;第

二、實現擴充套件方法的類方法必須是靜態方法;第

三、實現擴充套件方法的類方法的第乙個引數必須是使用this關鍵字指明要實現擴充套件方法的類。例如,我們知道將乙個合法字串型別轉換為整型,可以使用int.parse()方法,假如我們希望為string型別擴充套件乙個toint方法應該怎麼辦呢?我們一起來看下面的這段**:

/// /// 1、定義乙個靜態類

/// 2、靜態類的名稱和要實現擴充套件方法的具體類無關

///

public static class someclass

}

好了,現在我們編寫完這個擴充套件方法以後,就可以像下面這樣使用擴充套件方法了:

string str = "1234";

int val = str.toint();

這個示例向大家展示了如何編寫乙個無引數的擴充套件方法,那麼當我們需要在擴充套件方法中傳入引數的時候該怎麼做呢?我們只需要在第乙個引數後繼續加入引數的宣告就好了。例如我們在unity3d中常常需要給乙個3d物體設定座標,通常我們可以通過下面的**來實現:

transform.position = new vector3(1,1,1);
這個**到目前為止是比較簡潔的,可是我們知道在unity3d中除了position屬性以外還有localposition屬性,如果我們的**中再涉及座標計算的話,我相信這個**一定會變得非常的長。更有甚者,有時候我們只想改變三維座標中的乙個維度,可是我們必須給transform.position乙個三維座標,毫無意外地此時的**會變得更長。為了解決這個問題,我們可以擴充套件出三個方法setpositionx、setpositiony、setpositionz來分別為x、y、z三個座標分量進行賦值,我們繼續在someclass這個類中新增方法:

/// /// 設定tranform的x座標

///

/// 當前transform

/// x座標

public static void setpositionx(this transform tran, float x)

/// /// 設定tranform的y座標

///

/// 當前transform

/// y座標

public static void setpositiony(this transform tran, float y)

/// /// 設定tranform的z座標

///

/// 當前transform

/// z座標

public static void setpositionz(this transform tran, float z)

同樣的,我們現在可以直接為乙個三維物體的座標進行賦值:

transform.setpositionx(1.0f);

transform.setpositiony(1.0f);

transform.setpositionz(1.0f);

擴充套件方法使用起來得心應手,所以我們這裡來討論下使用擴充套件方法的利弊。好處當然是自由而任性地使用擴充套件方法對類進行擴充套件,而且擴充套件方法在visual studio中的智慧型提示會以藍色向下箭頭進行標識。擴充套件方法的壞處則是要看設計擴充套件方法的人能否較好的駕馭這個特性啦,其實所有的技術都是一樣的,我常常在遊戲群裡聽到人鄙視unity3d引擎,以unreal engine4為遊戲引擎世界裡的泰山北斗,我承認ue4的畫面效果好,可是能真正用好這個引擎的人有多少呢?擴充套件方法在使用的時候應該遵守就近原則,即是在最小的範圍內使用擴充套件方法,對具體類而非抽象類實現擴充套件方法。我們使用擴充套件方法無非是因為它在邏輯層需要這樣的功能,所以我們沒有必要去改變抽象層的邏輯,因為這樣會「汙染」整個**。舉乙個簡單的例子,我們知道.net中的基類是object,如果我們對這個類進行擴充套件,毫無疑問它會影響所有繼承自object的類,這樣就會造成「汙染」,顯然是不可取的。

C 擴充套件方法 學習

c 中可以定義擴充套件方法,還可以為集合做擴充套件方法。示例如下 using system using system.collections.generic using myspace 注意 引入擴充套件方法的空間 namespace con 1 先生。with xugang console.wri...

擴充套件方法學習筆記 原

擴充套件方法是c 3.0中新加入的特性。msdn中對擴充套件方法的定義是 擴充套件方法使您能夠向現有型別 新增 方法,而無需建立新的派生型別 重新 編譯或以其他方式修改原始型別。擴充套件方法是靜態方法 並且第乙個引數要用this修飾 這個方法將作為第乙個引數也就是帶this引數的類的乙個擴充套件方法...

C 擴充套件方法 總結

擴充套件方法是靜態方法,它是類的一部分,但實際上沒有放在類的源 中。設計乙個money類 1 public class money29 public override string tostring 1013 假設向money類中新增乙個方法addtoamount,但是程式的源 不能直接修改,此時就...