我读到该委托是不可变的对象。
如果我有一个帖子:
EventHandler handler = (s, e) => Console.WriteLine("...");
EventHandler copy = handler;
copy(new object(), EventArgs.Empty);
该副本是线程安全操作,因此当我调用copy(...)
时
如果另一个线程从handler
中删除了委托,则不会引发任何异常。
但是,如果我做,即:
handler.GetHashCode()
和copy.GetHashCode()
它们都返回相同的代码。
我认为赋值运算符执行了该委托的新实例
并且新引用已放入copy
变量......
如果copy
和handler
两者都引用,那么它们如何才能独立
内存中的同一个对象?
困惑!
答案 0 :(得分:2)
我认为赋值运算符执行了该委托的新实例,并且新引用已放入复制变量...
不,它不会创建新实例。它分配当前实例,因此如果另一个线程更改了事件上的已注册委托,则当前实例保持不变。由于事件处理程序是不可变的,因此事件处理程序上的赋值将产生一个新对象。
作为旁注:字符串也是不可变的,但是将一个字符串分配给另一个字符串并不会复制它,也就是说它会创建一个新实例'。