C#的蘭姆達表示式與委託配合使用時的一些問題
阿新 • • 發佈:2018-10-31
大家應該都是知道,C#的委託+=和-=都是根據函式的簽名來識別的,但是如果符號的右邊是一個蘭姆達表示式(例如:delegate0+=()=>{}),這個時候怎麼判斷右邊的函式是不是同一個呢?
寫個例子來測試一下,如下圖,執行兩次Test方法,傳遞的引數都是一樣的蘭姆達表示式,通過action委託的-=並沒有將看起來一樣的蘭姆達表示式函式去除,為什麼呢?(當然如果是傳遞兩個確切的函式名就會最終只打印一行“hello world”,讀者可自行測試),
我們來斷點除錯一下:可以看出運行了兩次Test方法雖然傳遞的引數一樣,但是Test方法內部獲得的函式名(紅框)卻不一樣,也就是說在程式執行時,編譯器會根據一定的規則給蘭姆達表示式賦予一個簽名,<.ctor>表示蘭姆達表示式所屬的函式名,也就是宣告在哪個函式內,後面的b_2-0應該就是一些起名規則,同時,可以發現宣告在同一個函式內部的兩個(可以延伸到多個)一樣的蘭姆達表示式,程式在執行時會賦予不同的簽名, 所以通過委託的-=時並沒有起作用,最終執行了兩次“hello world”。
為了測試更全面,我們將同樣的蘭姆達表示式在函式內只申明一次測試一下。
我們讓Wraper方法執行兩遍,蘭姆達方法寫在Wraper方法內部,執行的效果是隻列印一次“hello world”,也就是說action的委託-=起作用了,識別了傳遞進來的引數是同一個簽名,我們再打一次斷點看一下。
斷點詳情:
可以看出,兩次斷點得到的函式名字是一樣的,也就是說委託的-=會根據第二次傳遞進來的引數將第一次保留的函式去除,所以最終只執行了一次“hello world”。完畢。
可能理解有誤或者剖析尚淺,如有大神瞭解的更多,煩請指導!謝謝。