委派不变性和赋值运算符

时间:2016-04-04 12:32:12

标签: c# delegates

我读到该委托是不可变的对象。

如果我有一个帖子:

EventHandler handler = (s, e) => Console.WriteLine("...");
EventHandler copy = handler;
copy(new object(), EventArgs.Empty);

该副本是线程安全操作,因此当我调用copy(...)时 如果另一个线程从handler中删除了委托,则不会引发任何异常。

但是,如果我做,即:

handler.GetHashCode()copy.GetHashCode()它们都返回相同的代码。

我认为赋值运算符执行了该委托的新实例 并且新引用已放入copy变量......

如果copyhandler两者都引用,那么它们如何才能独立 内存中的同一个对象?

困惑!

1 个答案:

答案 0 :(得分:2)

  

我认为赋值运算符执行了该委托的新实例,并且新引用已放入复制变量...

不,它不会创建新实例。它分配当前实例,因此如果另一个线程更改了事件上的已注册委托,则当前实例保持不变。由于事件处理程序是不可变的,因此事件处理程序上的赋值将产生一个新对象。

作为旁注:字符串也是不可变的,但是将一个字符串分配给另一个字符串并不会复制它,也就是说它会创建一个新实例'。