代表的目的是什么,在c#中是不可变的?

我正在阅读C#2012中的一本书,在“结合代表”一节中没有注意到这一点? 代表的目的是不可改变的。

组合代理到目前为止,您看到的所有代理在其调用列表中只有一个方法。 可以使用加法运算符“组合”代表。 操作的结果是创建一个新的委托,其中包含一个调用列表,该列表是两个操作数委托的调用列表的副本的串联。 例如,以下代码创建三个委托。 第三个代表是由前两个代表组合而成。

MyDel delA = myInstObj.MyM1; MyDel delB = SClass.OtherM2; MyDel delC = delA + delB; // Has combined invocation list 

尽管组合代表这一术语可能会给人一种修改操作数委托的印象,但它们根本没有改变。 事实上,代表是不可改变的。 创建委托对象后,无法更改它。 图15-6说明了上述代码的结果。 请注意,操作数委托保持不变。

在此处输入图像描述

线程安全和速度是这里的主要关注点。 委托更新不是primefaces的,它需要更新6个字段和列表。 使其成为primefaces以便它不会被破坏需要一个锁,这对于很少需要线程安全的基本操作来说太昂贵了。

通过使其成为不可变的,委托对象不会被破坏,因为它总是在没有人引用的对象上设置字段。 重新分配委托对象引用是atomic,一种基本的.NET内存模型保证。 所以不再需要锁了。 权衡是内存使用效率较低,这是一个小小的惩罚。

请记住,线程安全的委托更新不会自动使您的代码也是线程安全的。 test-and-fire代码需要复制引用以避免NRE,并且您可以回调已经取消订阅的方法。

委托是指向一个方法的指针,无论是具体的还是匿名的( 好吧,甚至匿名方法都是用一些编译器生成的标识符编译的 )。

那些指向某些具体事物的东西是可变的是合理的吗? 我不这么认为。 每个实例代表一个指向某个方法的指针。 你想指出其他一些方法吗? 创建一个新指针。 也就是说,您实例化一个新的委托。

另一方面,添加两个或多个委托会产生这种结果,因为+运算符可能会过载 。 也就是说,委托可以是添加的一部分,但内部+的重载正在创建一个带有调用列表的新委托。