2009-04-22 7 views
4

オーバーロード - 単項演算子は、不変タイプのために、あなたが好きなことを書くことができます:は+/-単項演算子あなたがオーバーロードすると

public static Point3 operator - (Point3 p) 
{ 
    return new Point3 (-p.X, -p.Y, -p.Z); 
} 

をしかし、+単項演算子のために、どのようにそれを実装する必要がありますか?

public static Point3 operator + (Point3 p) 
{ 
    return p; 
} 

又はこのような:このよう

public static Point3 operator + (Point3 p) 
{ 
    return new Point3 (p); 
} 
+0

2番目の例では、operator +、not not-?を意味しますか? – Zifre

+0

ええ、ごめんなさい。 –

+0

正確のために、「this」は静的メソッドには存在しません。私はあなたが "-p.X、-p.Y、-p.Z"を過負荷に書き込むことを意図したと思います。 –

答えて

7

いずれにしても問題ありません。 2つの方法のいずれかで元のオブジェクトを変更しているわけではありません。

string.substring(0, string.length())を呼び出すと、元の文字列が返されない理由はありません。

不変性で署名する唯一の契約は、いったんオブジェクトが作成されると変更されないことです。

1

(それは遅いであろうが)私は、第二の方法を好むだろうが、Point3が3D点であると仮定すると、それはおそらくstructないでなければなりませんa class

2

構造体が不変の場合は、元の値を返すように選択できます。

変更可能な場合は、新しいものを返します。

2

私の意見では、Point3.Equals()の実装に依存します。

以下のコードを検討:

Dictionary<Point3, string> cache; 
Point3 pointA = new Point3(1, 2, 3); 
Point3 pointB = new Point3(1, 2, 3); 
cached[pointA] = "Value Aaa"; 
cached[pointB] = "Value Bbb"; 
Console.WriteLine(cached[pointA]); 
Console.WriteLine(cached[pointB]); 

(それらが同じオブジェクトである場合pointA.Equals(pointB))Point3とは、参照セマンティクスを持っている場合、この意志出力:

Value Aaa 
Value Bbb 

Point3とを有している場合(x、y、zの値が等しい場合はpointA.Equals(pointB))、 これが出力されます。

Value Bbb 
Value Bbb 

値のセマンティクスでは、新しいオブジェクトを作成するかどうかは関係ありません。あなたはたぶん同じものを返すことでゴミを生み出さないようにすることができます。

型に参照セマンティクスがある場合、おそらくunary plusが新しいオブジェクトを作成し、他の演算子と同じように動作するようにします。

1

うーん....

public static Point3 operator - (Point3 p) 
{ 
    return new Point3 (-p); 
} 

は私が間違っているなら、私を修正しますが、無限再帰を設定しませんか? unary( - )演算子メソッドの中でunary( - )演算子を呼び出すとします。

あなたがこれをしたいとしている私には思える:

public static Point3 operator - (Point3 p) 
{ 
    return new Point3 (-(p.X), -(p.Y), -(p.Z)); 
    // EDIT: Added parens for the sake of explicity. I don't recall the operator precedence in this case. 

} 

あなたはPoint3とクラスのように、コンストラクタやプロパティを持っていると仮定します。

+0

ありがとう、ええ、私はそれに注意を払わなかった、私が推測する考えにこだわってしまった。 –

関連する問題