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

Mar*_*tin 7 c# delegates

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

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

MyDel delA = myInstObj.MyM1;
MyDel delB = SClass.OtherM2;
MyDel delC = delA + delB; // Has combined invocation list
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

Han*_*ant 7

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

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

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