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

标签 c# delegates

我读到委托(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/

相关文章:

c# - .NET 随机程序集在磁盘上被修改

c# - Dispatcher.Invoke 不捕获异常

c# - 如何将事件传递给方法然后订阅它?

c# - 包含实例方法委托(delegate)的静态字典

c# - 在 Windows 服务中捕获 'external drive inserted' 事件

c# - 如果给定的测试用例失败,则中止整个测试套件

C#:iTextSharp,如何编辑 pdf 文档的标题属性?

c# - 通用委托(delegate)或通用转换问题

javascript - 添加新记录时如何附加委托(delegate)

ios - 将数据从没有 Segue 的 VC 传递到非 VC 类