2

私はそのようなプロパティを書きました (私の XNA ゲーム オブジェクトの方向を表します):

public Vector2 Direction
{
    get { return direction; }
    protected set
    {
        (direction = value).Normalize(); // ***
        angle = MathHelper.WrapAngle((float)Math.Atan(direction.X / direction.Y));
    }
}

setは、オブジェクトの向きを角度で表し、同時に正規化されたベクトルで表す 2 つの同等のフィールドを設定します。

***でマークされた行が失敗したため、ゲームの開始に失敗しました。ベクトルを正規化しません。
この行を次のように変更しました。

direction = value;
direction.Normalize();

それは正常に動作します...なぜですか?***でマークされた行で、最初の操作はvalueを割り当ててから、 directionを正規化
すると仮定しました。しかし、それは真実ではありません。 _ __

__ _ _ ___
Normalize()Vector2クラスのメソッドです。

//
// Summary:
//     Turns the current vector into a unit vector. The result is a vector one unit
//     in length pointing in the same direction as the original vector.
public void Normalize();
4

1 に答える 1

4

Vector2 は構造体または値型であると想定しています。つまり、参照渡しではなく値渡しです。方向に値を割り当てると、値のコピーに方向が設定されます。さらに、式 (方向 = 値) によって返されるオブジェクトはコピーであり、方向にある同じインスタンスではありません。setter ブロックの外部に格納されていないオブジェクトに対して Normalize を呼び出しています。

これと同じ理由で、クラスのプロパティ ゲッターから返された構造体でメソッドを呼び出したり、プロパティを設定したりすることはできません。たとえば、例のプロパティが Monkey という名前のクラスにある場合は、次の点に注意してください。

Monkey m = new Monkey();
m.Direction = new Vector2(...);
m.Direction.X = 2; // This will not compile.
m.Direction.Normalize(); // This will not do what you expect.
于 2012-05-05T13:07:07.570 に答える