作者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/cn.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