delegate 执行+= 之后不是同一个对象了 为什么啊

skillart 2016-02-28 12:05:03

public delegate void EventHandle(object a,object b);
Hashtable tests = new Hashtable();
void justTest()
{
EventHandle tmp = new EventHandle (xx1);
tests["a"] = tmp;
addHandel (xx2);
var han = (EventHandle)tests["a"];
han (4, 5);
}

public void addHandel (EventHandle h)
{
var han = (EventHandle)tests["a"];
var hanCopy = han;
han += h;
if (han != hanCopy)//true
{
Debug.Log ("not equal ");
}
tests ["a"] = han;//添加了这一句
}

小弟刚用到C#,遇到一个问题。
之前没有添加下面一句,一直不对。最后发现delegate 执行+= 之后不是同一个对象了。
为什么要这么弄啊??
...全文
311 12 打赏 收藏 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
skillart 2016-02-29
  • 打赏
  • 举报
回复
引用 4 楼 tcmakebest 的回复:
代理对象 delegate 本来就不是这么玩的哦, 比较,大小于操作不适合它
引用 5 楼 caozhy 的回复:
+=其实是语法糖,返回一个新的多播委托对象。
那为什么要返回一个新的对象呢
skillart 2016-02-29
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
那你觉得代码
var x = new Team();
x = x + new Person();
这时候变量 x 还是引用同一个 Team 吗? 变量 han 本来就是是一个变量而已,它就是用来引用不同对象的。你声明 han 变量本来就是用来引用“一串”委托链条的。 delegate 关键字所声明的 Delegate,它既可能是一个基础的 Delegate,也可能是一个 MulticastDelegate(这也是 Delegate)。han 总是引用这个链条,你写了代码
han += ......
自然就是对 han 变量重新赋值了(应用到别的对象了)。 这就是一个很普通的要理解的流程问题。
谢谢你哈。我开始以为+=是类似c++的函数重载,就是一个对象里面有个容器list把所有的callBack都add进去,不应该改变对象才对。
skillart 2016-02-29
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
+=其实是语法糖,返回一个新的多播委托对象。
谢谢 已了解。
skillart 2016-02-29
  • 打赏
  • 举报
回复
操作符重载。
冰冷的小爪 2016-02-29
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
+=其实是语法糖,返回一个新的多播委托对象。
赞同
衣舞晨风 2016-02-29
  • 打赏
  • 举报
回复
http://blog.csdn.net/jiankunking/article/details/45479105
tcmakebest 2016-02-28
  • 打赏
  • 举报
回复
代理对象 delegate 本来就不是这么玩的哦, 比较,大小于操作不适合它
threenewbee 2016-02-28
  • 打赏
  • 举报
回复
+=其实是语法糖,返回一个新的多播委托对象。
  • 打赏
  • 举报
回复
那你觉得代码
var x = new Team();
x = x + new Person();
这时候变量 x 还是引用同一个 Team 吗? 变量 han 本来就是是一个变量而已,它就是用来引用不同对象的。你声明 han 变量本来就是用来引用“一串”委托链条的。 delegate 关键字所声明的 Delegate,它既可能是一个基础的 Delegate,也可能是一个 MulticastDelegate(这也是 Delegate)。han 总是引用这个链条,你写了代码
han += ......
自然就是对 han 变量重新赋值了(应用到别的对象了)。 这就是一个很普通的要理解的流程问题。
社会工具人 2016-02-28
  • 打赏
  • 举报
回复
没指定估计自动调用了默认的。。。
社会工具人 2016-02-28
  • 打赏
  • 举报
回复
事件实际上就是一个多播委托 需要委托指向实际的执行函数 在驱动事件发生后 通过委托来调用回调函数 刚才那条代码给委托赋值了函数 不赋值事件没有执行函数

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧