來看看兩種好玩的方法,擴充套件方法和分部方法

2021-07-29 08:28:07 字數 3155 閱讀 5346

腎不見了?小花絮小花絮,要是腎真沒了,也吹不了牛,敗不了火了,繼續言歸正傳。

一:擴充套件方法

說到擴充套件方法,我想大家都已經再熟悉不過了,也許你的解決方案中有無數個這樣的擴充套件方法,

自從有了linq之後,我們的集合就再也不單純了。

從下面的linq類中,所有的方法都擴充套件在ienumerable上,恰恰我們的集合都繼承於ienumerable介面下面。

然後我們在編碼的時候就來了很多這樣的擴充套件方法。

那麼現在問題來了,學挖掘機技術哪家強o(∩_∩)o...?

下面舉乙個擴充套件string類的乙個asint()方法,然後看看il**都幹了些什麼?

從il的call指令可以看出,其實擴充套件方法本質上是呼叫靜態類stringextension中的asint方法,所以可以看出其實這也是編譯器為了提高我們的開發

效率而提供的的乙個語法糖而已,所以上面的寫法同樣可以寫成這樣,同樣可以看出下面的寫法就麻煩了很多。

1            s = stringextension.asint("

123");

那麼下面又來了乙個問題,既然可以隨意擴充套件,那麼我能不能擴充套件string類的任何乙個方法?比如說tolower()? 從下圖中我們可以得到答案,在vs的智慧型感

知中顯示出的方法還是string自帶的方法,而不是我擴充套件的方法,這就說明編譯器在用方法的時候還是有優先順序的,正是因為有了這個優先順序的問題,給我們

帶來了乙個很大的「版本控制問題」,就比如我剛才擴充套件的asint()方法,如果後期的clr版本中在string類中自己增加了asint()方法的話,那我擴充套件的asint()

方法從此就

會被忘卻於天涯,所以這個問題要留一點心。

二:分部方法

說起分部方法,你可能會問它有什麼應用場景,畢竟在我們實際的編碼中很少使用到,到是分部類用的不少,所以啦,我必須找點場景出來。

恰好在ef中還真給找到了。

具體怎麼建乙個ef檔案就不說啦,我們就看看ef生成的模板**。

1

public

partial

class

dataclasses1datacontext : system.data.linq.datacontext215

16public dataclasses1datacontext(string

connection) :

17base

1821

22public

dataclasses1datacontext(system.data.idbconnection connection) :

23base

2427

28public dataclasses1datacontext(string

29base

3033

34public

35base

3639

40public system.data.linq.tablestudent

4146

}47 }

可以看到在幾乎所有的建構函式中都有這樣的乙個oncreated方法,這個具體的oncreated的實現,你可以自定義乙個分部方法來實現。裡面可以放些你認

為適應你專案需要的東西,比如:日誌,統計啥的。

根據上面ef的例子,我舉個簡簡單單的sample,就是用log方法來記錄當前登陸該db的使用者

1

namespace211

12console.read();13}

14}1516

///17

///比如這是codesmith生成的**

18///

19public

partial

class

db2027}

2829

///30

///自己實現的**

31///

32public

partial

class

db33

個使用者登陸db

", ++instancecount);39}

4041 ~db()

424546}

47 }

再來看看il:

可以看出在編譯器編譯之後,自動生成的db和我自定義的db類已經合二為一了,當然這必須是我們預期的結果,不過這裡有乙個小注意的地方,如果這

裡我沒有實現自定義的log方法,那麼自動生成db類中的log方法會何去何從呢?因為它僅僅是定義乙個方法的口子,並沒有實現。

1

namespace211

12console.read();13}

14}1516

///17

///比如這是codesmith生成的**

從上面的圖中可以看到兩點好玩的地方:

①: 已經沒有了log方法的il指令,這就說明如果只定義了方法介面而不實現的話,編譯器會直接忽視它。

兩種排序方法

題目描述 考拉有n個字串字串,任意兩個字串長度都是不同的。考拉最近學習到有兩種字串的排序方法 1.根據字串的字典序排序。例如 car carriage cats doggies koala 2.根據字串的長度排序。例如 car cats koala doggies carriage 考拉想知道自己的...

兩種排序方法

考拉有n個字串字串,任意兩個字串長度都是不同的。考拉最近學習到有兩種字串的排序方法 1.根據字串的字典序排序。例如 car carriage cats doggies koala 2.根據字串的長度排序。例如 car cats koala doggies carriage 考拉想知道自己的這些字串排...

兩種排序方法

題目描述 考拉有n個字串字串,任意兩個字串長度都是不同的。考拉最近學習到有兩種字串的排序方法 1.根據字串的字典序排序。例如 car carriage cats doggies koala 2.根據字串的長度排序。例如 car cats koala doggies carriage 考拉想知道自己的...