分配和方法调用顺序

时间:2012-05-05 12:23:01

标签: c# c#-4.0 call normalize

我写了这样一个属性(代表我的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();

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

_ __ __ _ < / em> _ ___
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();

1 个答案:

答案 0 :(得分:4)

我假设Vector2是一个结构或值类型,这意味着它是按值传递而不是通过引用传递。为方向指定值时,您将指向值的副本。此外,表达式返回的对象(direction = value)是一个副本,而不是方向相同的实例。您正在对从未存储在setter块之外的对象调用Normalize。

出于同样的原因,您无法在类的属性getter返回的结构上调用方法或设置属性。例如,如果示例中的属性位于名为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.