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在执行之后仍然保留它.
有没有办法实现这一目标?
你不应该期望ms[0]改变.在它被初始化之后,fromList根本没有连接ms- fromList并且ms[0]碰巧具有相同的值,但这就是全部.+ =返回一个新值(实际上应该如此),因此您只需更改存储的值fromList,这完全独立于列表中的值.(注意,这里的值是引用,而不是对象.)
不要试图改变这种行为 - 它正在做正确的事情.改变你的期望.
如果您确实希望列表的内容反映更改,则需要更改列表中的值以引用新对象,或者需要更改代码以改变现有对象而不是创建新对象.如果采取后一种方法,你应该不是一个运营商内做到这一点.相反,创建一个Add方法,所以你打电话:
fromList.Add(addie);
Run Code Online (Sandbox Code Playgroud)
很明显,这是一个变异操作,所以它不会打破任何期望.
我个人尝试使用不可变类型,并调整您的设计,以便您不需要更改列表(或直接在列表上操作).