ほとんどの情報源によると、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
では、接尾辞と接頭辞のインクリメント/デクリメントの正確な違いは何ですか?また、それがオーバーロードにどのように影響するのでしょうか? これらの演算子は、クラスとプリミティブ型に対して同じように機能しますか?