先看乙個擴充套件方法的例子:
1class
program 2
9}
1011
public
static
class
expandint
12
18 }
為乙個型別擴充套件乙個方法如此只簡單,但是它究竟為我們做了什麼呢,為什麼我可以呼叫的addtooldnum方法?還是讓我們從il**層面來看看吧。
這裡是上面**編譯的il:
1.method
public
hidebysig static int32
addtooldnum(
2int32 oldnum, int32 newnum) cil
managed
3 //
end of method expandint::addtooldnum
發現它和一般的靜態方法沒什麼區別,唯一不同的是多了一行呼叫[system.runtime.compilerservices.extensionattribute]:
custom instancevoid [system.core]system.runtime.compilerservices.extensionattribute::.ctor() = ( 01
0000
00 )
msdn告訴我system.runtime.compilerservices.extensionattribute表明乙個法是一種可拓方法, 或乙個類或集合包含擴充套件方法【這裡我也不太懂,嘿嘿】。從這個型別的結尾extension_attribute_就可看出它是乙個特性類。 為我們的addtooldnum方法新增了必要的元資料。
再來看看main方法裡發生了什麼情況:
1.method
public
hidebysig static void main() cil
managed
2 //
end of method program::main
注意這一行,編譯器把我們寫的mynum = mynum.addtooldnum(1)編譯成這樣:
il_0005:
call
"例項方法"的呼叫換成了expandint::addtooldnum(int32,int32)靜態方法的呼叫,這就是擴充套件方法的本質所在了。
我們真的擴充套件了int32類的例項方法了嗎?沒有,編譯器幫我們披了一層外衣, 把對「例項方法」的呼叫在編譯時期改變成了靜態類中的靜態方法的呼叫,所以擴充套件方法是一種編譯時技術。當擴充套件方法和例項方法簽名相同時,例項方法優先使用。
初識c (31)之返回值優化
返回值優化 return value optimization,縮寫為rvo 是c 的一項編譯優化技術。它最大的好處是在於 可以省略函式返回過程中複製建構函式的多餘呼叫,解決 c 中長久以來為人們所詬病的臨時物件的效率問題 先來看一下測試 includeusing namespace std cla...
C 擴充套件方法
c 語言從3.0開始增加了乙個很特別的功能 擴充套件方法。那麼擴充套件方法起什麼作用呢?很多時候我們想為已經存在的類擴充套件某些功能,而又沒有必要去繼承該類,甚至有時候這個類根本就不允許繼承,如string類,這時候就可以使用擴充套件方法來為其擴充套件功能。下面舉例說明 一 我們建立乙個類庫如下 c...
C 擴充套件方法
c 語言從3.0開始增加了乙個很特別的功能 擴充套件方法。那麼擴充套件方法起什麼作用呢?很多時候我們想為已經存在的類擴充套件某些功能,而又沒有必要去繼承該類,甚至有時候這個類根本就不允許繼承,如string類,這時候就可以使用擴充套件方法來為其擴充套件功能。下面舉例說明 一 我們建立乙個類庫如下 c...