如果委托是不可变的,为什么我可以做x + = y这样的事情?

阅读C#深度,第2版 ,第2.1.2节关于组合和删除代表。

小节标题指出“代表是不可改变的”,并且“关于它们的任何内容都不能改变”。 但是,在下一段中,它讨论了使用类似的结构

x += y; 

其中xy是兼容委托类型的变量。

我不是刚刚换x吗? 或者,当我这样做时(即,立即)处理x时,不变性部分是否处理?

这就像做:

 string x = "x"; string y = "y"; x += y; 

字符串也是不可变的。 上面的代码没有改变字符串对象 – 它将x设置为不同的值。

您需要区分变量对象 。 如果类型是不可变的,则意味着在构造之后,您无法更改该类型实例中的数据。 您可以为该类型的变量赋予不同的值。

如果你理解字符串是如何工作的,那么委托也是如此。 + =实际上称为Delegate.Combine,所以这个:

 x += y; 

相当于:

 x = Delegate.Combine(x, y); 

它不会改变x 之前引用的委托对象的任何内容 – 它只是创建一个新的委托对象,并为x指定一个引用该新委托的值。

您已更改x ,但未更改其值(即它所持有的委托)。

它与以下相同:

 int num = 4; num += 2;