C#的蘭姆達表達式與委托配合使用時的一些問題


大家應該都是知道,C#的委托+=和-=都是根據函數的簽名來識別的,但是如果符號的右邊是一個蘭姆達表示式(例如:delegate0+=()=>{}),這個時候怎么判斷右邊的函數是不是同一個呢?

寫個例子來測試一下,如下圖,運行兩次Test方法,傳遞的參數都是一樣的蘭姆達表達式,通過action委托的-=並沒有將看起來一樣的蘭姆達表達式函數去除,為什么呢?(當然如果是傳遞兩個確切的函數名就會最終只打印一行“hello world”,讀者可自行測試),

我們來斷點調試一下:可以看出運行了兩次Test方法雖然傳遞的參數一樣,但是Test方法內部獲得的函數名(紅框)卻不一樣,也就是說在程序運行時,編譯器會根據一定的規則給蘭姆達表達式賦予一個簽名,<.ctor>表示蘭姆達表達式所屬的函數名,也就是聲明在哪個函數內,后面的b_2-0應該就是一些起名規則,同時,可以發現聲明在同一個函數內部的兩個(可以延伸到多個)一樣的蘭姆達表達式,程序在運行時會賦予不同的簽名,所以通過委托的-=時並沒有起作用,最終執行了兩次“hello world”。

 為了測試更全面,我們將同樣的蘭姆達表達式在函數內只申明一次測試一下。

我們讓Wraper方法運行兩遍,蘭姆達方法寫在Wraper方法內部,執行的效果是只打印一次“hello world”,也就是說action的委托-=起作用了,識別了傳遞進來的參數是同一個簽名,我們再打一次斷點看一下。

 

斷點詳情:

 

 可以看出,兩次斷點得到的函數名字是一樣的,也就是說委托的-=會根據第二次傳遞進來的參數將第一次保留的函數去除,所以最終只執行了一次“hello world”。完畢。

可能理解有誤或者剖析尚淺,如有大神了解的更多,煩請指導!謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM