日期:2014-05-17  浏览次数:20762 次

关于C#的++运算符的重载,隐含了赋值?
http://blog.csdn.net/mougaidong/article/details/5880181
看上面

最后,instance所引用对象的值确实改变了,但是程序中并没有显式对其赋值,难道是重++引起的? 

------解决方案--------------------
它的程序拷贝了一个新的AType,并且其中的字段加一作为返回值。

当然也可以这么写:
        public static AType operator ++(AType para)

        {

            Console.WriteLine("执行重载运算符++");
            para.data++;
            return para;

        }

------解决方案--------------------
不是对象的值变了,而是引用变了。

obj++;
相当于:
obj = obj + 1;

这里的+ 1是形象的描述,实际上它应该就是自定义的++运算函数:
obj = obj.operator++();

注意obj引用被改变了。
------解决方案--------------------
引用:
Quote: 引用:

不是对象的值变了,而是引用变了。

obj++;
相当于:
obj = obj + 1;

这里的+ 1是形象的描述,实际上它应该就是自定义的++运算函数:
obj = obj.operator++();

注意obj引用被改变了。


谢谢,我就是这个意思,可能没有表达清楚。

那么是不是说:
++、--这样的重载根据逻辑上的说语义改变了引用(实际上就是赋值),另外还有没有类似的例子呢?(我感觉+=这样的可能算是吧,虽然不能直接重载+=,但是通过重载+间接实现了逻辑上的的语义)。

请继续指教


一般我们不建议对引用类型重载++运算。你可以看到,我在2L的写法,事实上是应该修改原来的对象还是返回一个新的,这个由重载者自己决定。但是有一条,++应该和+运算是统一的。否则就更加混淆了。
------解决方案--------------------
想想两种++的语义

------解决方案--------------------
int a;
int i=a++;
a 等于多少 i等于多少

------解决方案--------------------
引用:
Quote: 引用:

int a;
int i=a++;
a 等于多少 i等于多少

从原始代码看,没看出哪里改了instance所引用对象的值!

所以我才有这个疑问的提出。

同时,也是因为按i++,--i这样的语义来理解,才觉得C#是这样处理的。另外,学C++时好象看到一个说法,重载运算符,虽然应该尽量和原始意义一致或接近,但是从语言本身来说并不要求也不能保证语义和原始语义有什么关联! 

这很简单,我说了,对于值类型,返回一个新的值和直接修改其实没有什么不同,比如
int i = 1;
int j = i;
i++;
此时j肯定还是1

对于引用类型,你怎么做是你的事情,因为这本身就是一个没有定数,也不存在什么和“原始意义”接近的问题。
------解决方案--------------------
引用:
另外还有没有类似的例子呢?(我感觉+=这样的可能算是吧,虽然不能直接重载+=,但是通过重载+间接实现了逻辑上的的语义)。


我以前举过一个例子:

主语 c1 = ....;
谓语 c2 = .....;
宾语 c3 = .....;
句子 clause = c1 + c2 + c3;


http://bbs.csdn.net/topics/360039451
------解决方案--------------------
可以自己定义几个运算符重载,例如
using System;
using System.Collections.Generic;
u