如何使+ =运算符保持对象引用?

Mik*_*lov 1 c# operators addition

说,我有一节课:

class M
{
     public int val; 
Run Code Online (Sandbox Code Playgroud)

还有一个+内部的操作员:

    public static M operator +(M a, M b)
    {
        M c = new M();
        c.val = a.val + b.val;
        return c;
    }
}
Run Code Online (Sandbox Code Playgroud)

而且我有一个List班级的对象:

List<M> ms = new List();
M obj = new M();
obj.val = 5;
ms.Add(obj);
Run Code Online (Sandbox Code Playgroud)

其他一些对象:

M addie = new M();
addie.val = 3;
Run Code Online (Sandbox Code Playgroud)

我可以做这个:

ms[0] += addie;
Run Code Online (Sandbox Code Playgroud)

它肯定会按照我的预期工作 - 列表中的值会发生变化.但如果我想这样做

M fromList = ms[0];
fromList += addie;
Run Code Online (Sandbox Code Playgroud)

ms由于显而易见的原因,它不会改变价值.

但直觉上我希望ms[0]在那之后也会改变.真的,我从列表中选择对象,然后用其他对象增加它的值.所以,由于我在添加之前对ms[0]in fromList进行了引用,我希望fromList在执行之后仍然保留它.

有没有办法实现这一目标?

Jon*_*eet 6

不应该期望ms[0]改变.在它被初始化之后,fromList根本没有连接ms- fromList并且ms[0]碰巧具有相同的值,但这就是全部.+ =返回一个新值(实际上应该如此),因此您只需更改存储的值fromList,这完全独立于列表中的值.(注意,这里的值是引用,而不是对象.)

不要试图改变这种行为 - 它正在做正确的事情.改变你的期望.

如果您确实希望列表的内容反映更改,则需要更改列表中的值以引用新对象,或者需要更改代码以改变现有对象而不是创建新对象.如果采取后一种方法,你应该不是一个运营商内做到这一点.相反,创建一个Add方法,所以你打电话:

fromList.Add(addie);
Run Code Online (Sandbox Code Playgroud)

很明显,这是一个变异操作,所以它不会打破任何期望.

我个人尝试使用不可变类型,并调整您的设计,以便您不需要更改列表(或直接在列表上操作).