C 3 1 擴充套件方法

2021-09-06 02:47:05 字數 1362 閱讀 9558

先看乙個擴充套件方法的例子:

1

class

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 instance

void [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...