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

时间:2022-12-06 23:11:24

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 执行+= 之后不是同一个对象了。
为什么要这么弄啊??

12 个解决方案

#1


事件实际上就是一个多播委托 需要委托指向实际的执行函数  在驱动事件发生后 通过委托来调用回调函数  刚才那条代码给委托赋值了函数  不赋值事件没有执行函数

#2


没指定估计自动调用了默认的。。。

#3


那你觉得代码 
var x = new Team();
x = x + new Person();
这时候变量 x 还是引用同一个 Team 吗?

变量 han 本来就是是一个变量而已,它就是用来引用不同对象的。你声明 han 变量本来就是用来引用“一串”委托链条的。

delegate 关键字所声明的 Delegate,它既可能是一个基础的 Delegate,也可能是一个 MulticastDelegate(这也是 Delegate)。han 总是引用这个链条,你写了代码
han += ......
自然就是对 han 变量重新赋值了(应用到别的对象了)。

这就是一个很普通的要理解的流程问题。

#4


代理对象 delegate 本来就不是这么玩的哦, 比较,大小于操作不适合它

#5


+=其实是语法糖,返回一个新的多播委托对象。

#6


引用 5 楼 caozhy 的回复:
+=其实是语法糖,返回一个新的多播委托对象。

赞同

#7


引用 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进去,不应该改变对象才对。

#8


操作符重载。

#9


引用 5 楼 caozhy 的回复:
+=其实是语法糖,返回一个新的多播委托对象。

谢谢 已了解。

#10


http://blog.csdn.net/jiankunking/article/details/45479105

#11


引用 4 楼 tcmakebest 的回复:
代理对象 delegate 本来就不是这么玩的哦, 比较,大小于操作不适合它


引用 5 楼 caozhy 的回复:
+=其实是语法糖,返回一个新的多播委托对象。

那为什么要返回一个新的对象呢

#1


事件实际上就是一个多播委托 需要委托指向实际的执行函数  在驱动事件发生后 通过委托来调用回调函数  刚才那条代码给委托赋值了函数  不赋值事件没有执行函数

#2


没指定估计自动调用了默认的。。。

#3


那你觉得代码 
var x = new Team();
x = x + new Person();
这时候变量 x 还是引用同一个 Team 吗?

变量 han 本来就是是一个变量而已,它就是用来引用不同对象的。你声明 han 变量本来就是用来引用“一串”委托链条的。

delegate 关键字所声明的 Delegate,它既可能是一个基础的 Delegate,也可能是一个 MulticastDelegate(这也是 Delegate)。han 总是引用这个链条,你写了代码
han += ......
自然就是对 han 变量重新赋值了(应用到别的对象了)。

这就是一个很普通的要理解的流程问题。

#4


代理对象 delegate 本来就不是这么玩的哦, 比较,大小于操作不适合它

#5


+=其实是语法糖,返回一个新的多播委托对象。

#6


引用 5 楼 caozhy 的回复:
+=其实是语法糖,返回一个新的多播委托对象。

赞同

#7


引用 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进去,不应该改变对象才对。

#8


操作符重载。

#9


引用 5 楼 caozhy 的回复:
+=其实是语法糖,返回一个新的多播委托对象。

谢谢 已了解。

#10


http://blog.csdn.net/jiankunking/article/details/45479105

#11


引用 4 楼 tcmakebest 的回复:
代理对象 delegate 本来就不是这么玩的哦, 比较,大小于操作不适合它


引用 5 楼 caozhy 的回复:
+=其实是语法糖,返回一个新的多播委托对象。

那为什么要返回一个新的对象呢

#12