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

时间:2011-08-12 17:16:42

标签: c# delegates immutability

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

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

这样的结构
x += y;

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

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

2 个答案:

答案 0 :(得分:39)

这就像在做:

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

x += y;

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

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

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

x += y;

相当于:

x = Delegate.Combine(x, y);

它不会改变x 以前引用的委托对象的任何内容 - 它只是创建一个 new 委托对象并分配{{1}一个引用该新委托的值。

答案 1 :(得分:5)

您已更改x,但未更改其值(即其持有的代理人)。

它与:

相同
int num = 4;
num += 2;