大多數消息來源表示,重載++和 - 運算符在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