作者yan04870449 (楊伯)
看板C_Sharp
標題[問題] 關於Delegate與Lambda的結合應用Bug
時間Wed Oct 8 20:03:07 2014
小弟附上一份我實現Bug的Code,我認為這應該不是Bug
而是我哪邊認知有錯。
雖然我是在Unity裡面執行的,但是我想在VS裡面應該也是一樣結果
以下是程式碼連結
https://gist.github.com/anonymous/4f06c028f7688c8047b1
以下是執行結果(Unity平台)
A:-1254341580
B:-1254341612
C:-1254341516
myAction 1:-1254341580
myAction 2:-1254341612
SET :-1254341612
myAction 3:-1254341612
myAction 4:-1254341612
iAction:-1254341612
A
B
myAction 5:-1254341612
myAction-----
C
B
A
問題就是當invodker被呼叫的時候,只有執行到A跟B,我的認知
應該是要連C也一起被呼叫到。
為此我有把IL編譯出來看,我發現似乎跟System.Delegate::Combine的
運作原理有關,但是我實在是看不出甚麼端倪,請版上前輩指教一下怎麼
會發生這種現象
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.166.45.149
※ 文章網址: http://webptt.com/m.aspx?n=bbs/C_Sharp/M.1412769793.A.150.html
1F:→ a926: 因為你在28行Set(myAction)的時候 10/08 23:27
2F:→ a926: 裡面只有combine _A跟_B並沒有_C 10/08 23:28
3F:→ a926: 然後invodker沒有串聯,純粹是執行你Action的結果 10/08 23:32
4F:→ yan04870449: 我原本的預期是,delegate是call be ref,所以我把他 10/09 09:37
5F:→ yan04870449: 送進去lambda的method裡面之後,我如果再對deleaget 10/09 09:37
6F:→ yan04870449: 增加method的話,我覺得應該要加的上去的,但是似乎 10/09 09:38
7F:→ yan04870449: 變成是call by value了!? 10/09 09:38
※ 編輯: yan04870449 (218.166.45.149), 10/09/2014 09:41:11
8F:→ a926: 這部分可能還是要請高手來解釋. 就我看完資料的感覺 10/09 12:13
9F:→ a926: delegate call be ref 是指他在呼叫函數的時候是by ref 10/09 12:13
10F:→ a926: 也就是delegate 存放的是函數的point 而不是存函數 value 10/09 12:15
12F:→ a926: 也許你可以留言再詢問他一下 10/09 12:16
14F:→ a926: 因為VB的寫法跟C#有點不一樣,可是看VB的Keyword就比較了解 10/09 12:40
15F:→ a926: 也謝謝你讓我複習了一下委派 XD 10/09 12:40