C# 委托不变性与赋值运算符

C# 委托不变性与赋值运算符,c#,delegates,C#,Delegates,我读到委托是不可变的对象 如果我已经进入一个线程: EventHandler handler = (s, e) => Console.WriteLine("..."); EventHandler copy = handler; copy(new object(), EventArgs.Empty); 该副本是线程安全操作,因此当我调用copy(…) 如果另一个线程将委托从处理程序中删除,则不会引发异常 但是如果我做了,即: handler.GetHashCode()和copy.GetHa

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

如果我已经进入一个线程:

EventHandler handler = (s, e) => Console.WriteLine("...");
EventHandler copy = handler;
copy(new object(), EventArgs.Empty);
该副本是线程安全操作,因此当我调用
copy(…)
如果另一个线程将委托从
处理程序中删除,则不会引发异常

但是如果我做了,即:

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

我认为赋值操作符创建了该委托的新实例 而且新的引用已放入
copy
变量中

因此,
copy
handler
如果都引用 内存中的同一对象

糊涂了

我认为赋值操作符创建了该委托的一个新实例,并且新引用已放入复制变量

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


附带说明:字符串也是不可变的,但将一个字符串分配给另一个字符串并不会复制它,即“创建一个新实例”。

您实际的问题似乎是“相等的哈希代码是否意味着两个变量引用同一实例”,答案是“否”.@CodeCaster但是在这种情况下,两个变量引用同一个对象。不可变意味着您无法更改该对象。但是,您可以将一个新对象分配给
处理程序
(甚至将其设置为null),并且该更改不会影响
copy
@CodeCaster,我的问题是委托不变性和赋值运算符,而不是GetHashCode的确切含义。@XD调整措辞:“handler.GetHashCode()和copy.GetHashCode()它们都返回相同的代码”和“如果它们都引用内存中的相同对象,那么复制和处理程序如何能够独立”表明您认为“相等的哈希代码意味着内存中的相同对象”,但不管怎样。因此,在复制之后,如果在
handler
上删除带有
-=
运算符的引用委托,实际上,它使用
Remove
方法创建一个新的
委托
,该委托不包含作为参数传递的委托。因此,如果
copy
指向同一个委托,则该方法仍然存在……是的,确实存在@xdevel2000