大多数消息来源说,在 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
。
那么,后缀和前缀递增/递减之间的确切区别是什么以及它如何影响重载?这些运算符对类和原始类型的行为方式相同吗?