3

-単項演算子をオーバーロードすると、不変型の場合、次のように記述できます。

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);
}
4

6 に答える 6

7

どちらの方法でも構いません。2つの方法のいずれでも、元のオブジェクトを変更していません。

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

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

于 2009-04-22T20:03:53.300 に答える
3

私の意見では、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]);

Point3 に参照セマンティクス (同じオブジェクトの場合は pointA.Equals(pointB)) がある場合、次のように出力されます。

Value Aaa
Value Bbb

Point3 に値のセマンティクス (x、y、z の値が等しい場合は pointA.Equals(pointB)) がある場合、次のように出力されます。

Value Bbb
Value Bbb

値のセマンティクスでは、新しいオブジェクトを作成するかどうかは問題ではありません。ガベージの作成を避けるために、おそらく同じものを返すことができます。

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

于 2009-04-22T20:40:29.017 に答える
1

私は2番目の方法を好みます(ただし、遅くなります)が、がPoint33Dポイントであると仮定すると、おそらくそうではstructないはずclassです。

于 2009-04-22T20:02:30.327 に答える
1

うーん....

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

私が間違っている場合は修正してください。しかし、それは無限再帰をセットアップしませんか? 単項 (-) 演算子メソッド内で単項 (-) 演算子を呼び出しています。

あなたはこれをやりたいと思っているようです:

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 クラスにそのようなコンストラクターとプロパティがあると仮定します。

于 2009-04-22T20:47:33.773 に答える