gpt4 book ai didi

c# - 委托(delegate)不变性和赋值运算符

转载 作者:行者123 更新时间:2023-11-30 23:27:45 24 4
gpt4 key购买 nike

我读到委托(delegate)是不可变对象。

如果我有一个线程:

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

那个副本是一个线程安全操作,所以当我调用 copy(...)如果另一个线程从 handler 中删除委托(delegate),则不会引发异常。

但是如果我做,即:

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

我以为赋值运算符做了那个委托(delegate)的一个新实例并且新引用已放入 copy 变量...

因此,如果 copyhandler 都引用,它们怎么可能是独立的内存中的同一个对象?

困惑!

最佳答案

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com