大多数消息来源表示,重载++和 - 运算符在c#中的结果会同时重载两者,postfix和prefix。但看起来他们的行为仍然不同。C#后缀和前缀增量/减量过载差异
class Counter
{
public Counter(int v = 0)
{
this.v = v;
}
public Counter(Counter c)
{
v = c.v;
}
public int GetValue() { return v; }
public static Counter operator ++(Counter c)
{
c.v++;
return new Counter(c);
}
private int v;
}
class Program
{
public static void Main()
{
Counter c1 = new Counter(1);
Counter c2 = c1++;
Counter c3 = ++c1;
c3++;
System.Console.WriteLine("c1 = {0}", c1.GetValue());
System.Console.WriteLine("c2 = {0}", c2.GetValue());
System.Console.WriteLine("c3 = {0}", c3.GetValue());
}
}
奇妙的是,虽然过载operator ++
返回复制原始类的,在该示例c1
和c3
成为同一个对象的引用,而c2
点不同的一个(c1=4, c2=2, c3=4
这里)。将Counter c3 = ++c1;
更改为Counter c3 = c1++;
输出c1=3, c2=2, c3=4
。
那么,后缀和前缀增量/减量之间的确切区别是什么,以及它如何影响超载?这些运算符是否对类和原始类型采用相同的方式?
您的'operator ++'中存在一个错误:您不仅为递增的值返回一个对象,而且修改该操作符所应用的对象。它应该是:'公共静态计数器运算符++(计数器c){返回新的计数器(c.v + 1); }' – dtb
但是这是增量应该做的事情,'我++'必须改变'我'的价值,不是吗? – Nick
编号'i ++'记得变量'i'的值(我们称之为'i_old'),计算值'i + 1'(我们称之为'i_new'),将值'i_new'存入变量'i',并返回值'i_old'。 – dtb