当前位置: 首页 > 编程语言 > C#

后自增运算符重载分享

时间:2023-04-10 20:50:02 C#

后自增运算符重载我在尝试重载C#中的后自增运算符时遇到了麻烦。使用整数,我们得到以下结果。诠释n;n=10;控制台.WriteLine(n);//10控制台.WriteLine(n++);//10控制台.WriteLine(n);//11n=10;控制台.WriteLine(n);//10控制台.WriteLine(++n);//11控制台.WriteLine(n);//11但是,当我尝试使用该类时,它看起来像是在交换对象。类帐户{公共int余额{得到;放;}公共字符串名称{得到;放;}publicAccount(stringname,intbalance){Balance=balance;名字=名字;}publicoverridestringToString(){returnName+""+Balance.ToString();}publicstaticAccountoperator++(Accounta){Accountb=newAccount("operator++",a.Balance);a.余额+=1;返回b;}publicstaticvoidMain(){Accounta=newAccount("original",10);控制台.WriteLine(a);//"原始10"账户b=a++;控制台.WriteLine(b);//"original11",expected"operator++10"Console.WriteLine(a);//"operator++10",expected"original11"}}调试应用,重载运算符方法,用旧值返回新的(10)对象和通过引用传递的对象有新值(11),但是对象被交换了在最后。为什么?关键是要明白Accountb=a++;作品。鉴于您的代码是如何编写的,这一行等同于:Accountb=a;一个++;这就是它将执行的命令。有效赋值(1)发生在增量之前。所以,这行的第一个效果就是a和b都引用了原来的对象a。现在将评估++部分。在运算符方法中,我们增加了原始对象的Balance。此时a和b都指向原来的Balance为11,b会一直这样下去。但是,您已经在运算符方法中创建了一个新对象并将其作为运算符的输出返回。a现在将更新为指向新创建的对象。所以,现在指向一个新的对象,而b继续指向原来的对象。这就是WriteLine输出出现交换的原因。正如@MarkusQ指出的那样,++运算符旨在进行就地修改。通过创建一个新对象,您打破了这个假设。对象上的运算符重载是一个棘手的主题,这是一个很好的例子,说明为什么在大多数情况下最好避免它。1-为了准确起见,在处理对象上的运算符时,赋值实际上不会在增量之前发生,但在这种情况下最终结果是相同的。实际上,原始对象引用被复制,操作是在原始对象上进行的,复制的引用赋值给左边的变量。如果您假装任务先发生,则更容易解释。真正发生的事情是这样的:Accountb=a++;发生这种情况是因为++运算符处理对象的方式:Accountcopy=a;Accountx=newAccount("operator++",a.Balance);A。余额+=1;//原始对象的Balance递增a=x;//a现在指向新的对象,copy仍然指向原来的Accountb=copy;//b和copynowpointsatthesame,original,object我的第一个想法是指出++的正常语义是就地修改。如果你想模仿你写:publicstaticAccountoperator++(Accounta){a.Balance+=1;返回一个;}而不是创建一个新对象。但是后来我意识到您正在尝试模仿后增量。所以我的第二个想法是“不要这样做”——语义不能很好地映射到对象上,因为值“used”实际上是一个可变的存储位置。但是没有人喜欢被一个随机的陌生人告诉“不要那样做”,所以我让微软告诉你不要那样做。我担心他们在这些问题上的话是最终决定。PS至于它为什么这样做,你实际上是在覆盖预增量运算符,然后像使用后增量运算符一样使用它。您应该始终返回更改后的值。C#使用此值作为新值,并根据运算符返回旧值或新值。以上就是C#学习教程:后自增运算符重载分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: