漫話CLR 委託

2022-04-30 17:36:13 字數 2257 閱讀 9140

委託,delegate,說白了也就是個語法糖.沒有他我們可以寫程式,有了他我們可以寫出更好的程式.

delegate

void feedback(int value);

方法簽名之前前加上 delegate 關鍵字,我們就定義了乙個最簡單的委託.但,事實上編譯器為我們做了另一件事:建立委託類.人肉解壓縮一下:

//這裡就是整個委託最為核心的內容,委託 = 封裝了的類 + invoke方法

class

feedback : system.multicastdelegate

注意生成的 invoke 方法,這個方法的和原來使用 delegate 建立的 方法簽名 原型是一致的. 可以說 委託 並不是一種新的操作或者行為之類的.他只是簡化了以前我們需要通過手動編碼的複雜程度.原來需要編寫乙個類來進行操作的步驟,現在由編譯器幫我們完成了,這個就是語法糖,這個就是委託.

多播委託,或者委託鏈,這個是什麼,其實就是在 編譯器 建立的 feedback 類中加入的乙個陣列,如果有多個委託方法連線到乙個委託上,執行的時候就相當於 foreach 這個陣列,每個方法 執行一下他的 invoke. 這個陣列放在**,其實就在繼承的 system.multicastdelegate 中,他有乙個私有成員變數, _invocationlist,這是個陣列,每次增加或者刪除乙個委託就是在進行維護這個 委託 陣列的操作.

//

多播委託的 invoke 方法執行類似下面的偽**

public

void invoke(int

value)

else

}

另:可以通過 geti

nvocationlist()方法來獲取多播委託繫結的成員.

泛型委託,就是系統中的 action 和 func,你可以在mscorlib.dll 和 system.core.dll 中找到他們,建議使用這些委託型別而不是定義更多的型別.

public

delegate

void

action();

public

delegate

void action(t obj);

public

delegate

void action(t1 arg1, t2 arg2);

public

delegate

void action(t1 arg1, t2 arg2,t3 arg3);

...public

delegate tresult func();

public

delegate tresult func(t obj);

public

delegate tresult func(t1 arg1, t2 arg2);

public

delegate tresult func(t1 arg1, t2 arg2,t3 arg3);

...

c#為委託提供了很多簡化的語法,比如委託連的 += 和 -= 操作實際上是delegate類中 combine 和 remove 方法的簡化, lambda 表示式實際上是匿名方法的一種簡化,匿名方法實際上在編譯的時候由編譯器自己生成了乙個方法 ... 這些簡化很有效的提高了我們的開發效率,但也讓一部分開發者感到迷茫.就如一句話所說:知道真相使你自由.明白其中的原理也會讓你更合理的使用這些語法糖,而不至於迷失在糖罐中.

簡化語法1: 不需要構造委託物件

button1.click += new

eventhandler(button1_click);

//可以簡化為

button1.click += button1_click;

實際上,第二種情況下在編譯的時候會由編譯器自行加上包裝器.

簡化語法2: 不需要定義**方法

可以理解為lambda 表示式和匿名函式,編譯的時候也是由編譯器"解壓"為正常的方法和類.

簡化語法3: 區域性變數不需要手動包裝到類中即可傳給**方法

jeffrey richter的乙個小規則:如果需要在**的方法中包含3行以上的**,就不使用 lambda表示式.

委託和反射,兩個重要的方法:

delegate del =delegate.createdelegate(...);

del.dynamicinvoke(...)  

//偽**,不多解釋,只是說明方法名和所在的位置

漫話CLR 定製Attribute

用了10頁紙來講attribute,其實重點只有這段話 所謂 定製attribute 就是乙個類的例項,它被序列化成為駐留在元資料中的乙個位元組流.在執行的時候,可以對元資料中包含的位元組進行反序列化,從而構造類的乙個例項.簡而言之,就是對乙個類的附加描述資訊.我個人理解為編譯到程式中的 注釋 這裡...

漫話成語 謠言

良言一句三冬暖,惡語相加徹骨寒。比惡語更可怕的就是謠言!今天我們就一起來看幾個與謠言有關的成語與典故吧。1.三人成虎 釋義 三個人謊報城市裡有老虎,聽的人就信以為真。比喻說的人多了,就能使人們把謠言當作事實。典故 原文 戰國策 魏策二 龐蔥與太子質於邯鄲,謂魏王曰 今一人言市有虎,王信之乎?王曰 否...

漫話密碼儲存

密碼是用來進行鑑權 身份認證 一種手段,說白了就是證明你是誰。一般鑑權都可以總結為下面3種形式 你知道什麼?如密碼,密碼提示問題等 你有什麼?如信用卡,token卡等 你是什麼?如指紋識別,瞳孔識別等 常見的針對密碼的攻擊方式有 暴力破解 brute force 字典攻擊 dictionary at...