2

我写了这样一个属性(代表我的 XNA 游戏对象的方向):

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

set设置两个等效场,它们以角度表示对象的方向,同时以归一化向量表示。

开始游戏失败,因为***标记的行失败。它不会对向量进行归一化。
我将此行更改为:

direction = value;
direction.Normalize();

它工作正常......为什么?
我假设在***标记的行中,第一个操作是分配,然后是规范化方向。但事实并非如此。

_ __ __ _ _ ___
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 是一个结构或值类型,这意味着它是按值传递的,而不是通过引用传递的。当您将值分配给方向时,您将方向设置为值的副本。此外,表达式 (direction = value) 返回的对象是一个副本,而不是方向上的同一个实例。您正在对从未存储在 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 回答