我经常读到structs应该是不可变的 - 根据定义它们不是吗?
你认为int是不可改变的吗?
int i = 0;
i = i + 123;
Run Code Online (Sandbox Code Playgroud)
似乎没关系 - 我们得到一个新的int并将其分配给i.那这个呢?
i++;
Run Code Online (Sandbox Code Playgroud)
好的,我们可以把它想象成一条捷径.
i = i + 1;
Run Code Online (Sandbox Code Playgroud)
怎么样struct Point?
Point p = new Point(1, 2);
p.Offset(3, 4);
Run Code Online (Sandbox Code Playgroud)
这真的改变了这一点(1, 2)吗?我们难道不应该将它视为Point.Offset()返回新点的下列捷径吗?
p = p.Offset(3, 4);
Run Code Online (Sandbox Code Playgroud)
这种想法的背景是这样的 - 没有身份的价值类型怎么可能是可变的?您必须至少查看两次以确定它是否发生了变化.但是如果没有身份,你怎么能这样做呢?
我不想通过考虑ref参数和拳击来使这个推理复杂化.我也知道,p = p.Offset(3, 4);表达不变性比做得好p.Offset(3, 4);.但问题仍然存在 - 根据定义,值不是不可变的值吗?
UPDATE
我认为至少涉及两个概念 - 变量或字段的可变性以及变量值的可变性.
public class Foo
{
private Point point; …Run Code Online (Sandbox Code Playgroud)