我读到委托(delegate)是不可变对象。
如果我有一个线程:
EventHandler handler = (s, e) => Console.WriteLine("...");
EventHandler copy = handler;
copy(new object(), EventArgs.Empty);
该复制是线程安全操作,因此当我调用 copy(...)
如果另一个线程从 handler
中消除了委托(delegate),则不会引发异常。
但是如果我做,即:
handler.GetHashCode()
和 copy.GetHashCode()
它们都返回相同的代码。
我认为赋值运算符做了该委托(delegate)的一个新实例
并且新引用已放入 copy
变量中...
因此,如果 copy
和 handler
都引用,它们如何能够独立
内存中的同一个对象?
困惑!
最佳答案
I thought that the assignment operator did a new instance of that delegate and that the new reference had put into copy variable...
不,它不会创建新实例。它分配当前实例,因此如果另一个线程更改事件上的注册委托(delegate),当前实例将保持不变。由于事件处理程序是不可变的,因此事件处理程序上的赋值将产生一个新对象。
顺便说一句:字符串也是不可变的,但是将一个字符串分配给另一个字符串并不会复制它,也称为“创建一个新实例”。
关于c# - 委托(delegate)不变性和赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36402767/