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

Joh*_*ohn 22 c# delegates immutability

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

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

x += y;
Run Code Online (Sandbox Code Playgroud)

where xy是兼容委托类型的变量.

我没有改变x吗?或者不变性部分是否处理何时x处理(即,立即)?

Jon*_*eet 39

这就像做:

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

x += y;
Run Code Online (Sandbox Code Playgroud)

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

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

如果您了解字符串的工作方式,那么委托就是一样的.+ =实际上称为Delegate.Combine,所以这个:

x += y;
Run Code Online (Sandbox Code Playgroud)

相当于:

x = Delegate.Combine(x, y);
Run Code Online (Sandbox Code Playgroud)

它不会改变x 先前引用的委托对象的任何内容- 它只是创建一个新的委托对象并分配x一个引用该新委托的值.

  • 怎么样,WROTE'C#In Depth'的回答 (20认同)
  • @Neil:是的,Jon Skeet的回答是如此极为罕见,因为这是一个值得注意的巧合. (10认同)
  • @Jon:哦,当然!我知道Stack Overflow不是SAAS(Skeet As A Service)!;) (4认同)

Shd*_*dNx 5

您已更改x,但未更改其值(即它所持有的代理).

它与以下相同:

int num = 4;
num += 2;
Run Code Online (Sandbox Code Playgroud)