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
那你觉得代码
变量 han 本来就是是一个变量而已,它就是用来引用不同对象的。你声明 han 变量本来就是用来引用“一串”委托链条的。
delegate 关键字所声明的 Delegate,它既可能是一个基础的 Delegate,也可能是一个 MulticastDelegate(这也是 Delegate)。han 总是引用这个链条,你写了代码
这就是一个很普通的要理解的流程问题。
var x = new Team();这时候变量 x 还是引用同一个 Team 吗?
x = x + new Person();
变量 han 本来就是是一个变量而已,它就是用来引用不同对象的。你声明 han 变量本来就是用来引用“一串”委托链条的。
delegate 关键字所声明的 Delegate,它既可能是一个基础的 Delegate,也可能是一个 MulticastDelegate(这也是 Delegate)。han 总是引用这个链条,你写了代码
han += ......自然就是对 han 变量重新赋值了(应用到别的对象了)。
这就是一个很普通的要理解的流程问题。
#4
代理对象 delegate 本来就不是这么玩的哦, 比较,大小于操作不适合它
#5
+=其实是语法糖,返回一个新的多播委托对象。
#6
赞同
#7
谢谢你哈。我开始以为+=是类似c++的函数重载,就是一个对象里面有个容器list把所有的callBack都add进去,不应该改变对象才对。
#8
操作符重载。
#9
谢谢 已了解。
#10
http://blog.csdn.net/jiankunking/article/details/45479105
#11
那为什么要返回一个新的对象呢
#1
事件实际上就是一个多播委托 需要委托指向实际的执行函数 在驱动事件发生后 通过委托来调用回调函数 刚才那条代码给委托赋值了函数 不赋值事件没有执行函数
#2
没指定估计自动调用了默认的。。。
#3
那你觉得代码
变量 han 本来就是是一个变量而已,它就是用来引用不同对象的。你声明 han 变量本来就是用来引用“一串”委托链条的。
delegate 关键字所声明的 Delegate,它既可能是一个基础的 Delegate,也可能是一个 MulticastDelegate(这也是 Delegate)。han 总是引用这个链条,你写了代码
这就是一个很普通的要理解的流程问题。
var x = new Team();这时候变量 x 还是引用同一个 Team 吗?
x = x + new Person();
变量 han 本来就是是一个变量而已,它就是用来引用不同对象的。你声明 han 变量本来就是用来引用“一串”委托链条的。
delegate 关键字所声明的 Delegate,它既可能是一个基础的 Delegate,也可能是一个 MulticastDelegate(这也是 Delegate)。han 总是引用这个链条,你写了代码
han += ......自然就是对 han 变量重新赋值了(应用到别的对象了)。
这就是一个很普通的要理解的流程问题。
#4
代理对象 delegate 本来就不是这么玩的哦, 比较,大小于操作不适合它
#5
+=其实是语法糖,返回一个新的多播委托对象。
#6
赞同
#7
谢谢你哈。我开始以为+=是类似c++的函数重载,就是一个对象里面有个容器list把所有的callBack都add进去,不应该改变对象才对。
#8
操作符重载。
#9
谢谢 已了解。
#10
http://blog.csdn.net/jiankunking/article/details/45479105
#11
那为什么要返回一个新的对象呢