3

私が持っている場合:

class Test
{
    private Vector2 v;

    public Vector2 Velocity
    {
        get { return v; }
        set { v = value; }
    }
}

その後:

Test t = new Test();

t.Velocity = new Vector2(2, 2);
t.Velocity.Normalize();
Console.WriteLine(t.Velocity); // here not normalized

Vector2 tmp = t.Velocity;
tmp.Normalize();
t.Velocity = tmp;
Console.WriteLine(t.Velocity); // here normalized

Console.Read();

プロパティVelocityでNormalizeを直接呼び出そうとすると、正規化されず、tmp Vector2では正規化されるのはなぜですか?

PSVector2は構造体です:

public struct Vector2 : IEquatable<Vector2>
{
    public float X;
    public float Y;
    ...
    public void Normalize() {...}
}
4

4 に答える 4

6

質問は、実際にプロパティがどのように管理されるかではなく、.NETFramework内でどのように管理されるかに関係している思います。.NET Frameworkvalue types

私はCADカーネルを使用しましたが、提供されたコードからは明らかではありませんが、それは(通常は高速割り当て/レンダリングの高速化のためです)であると思います。Vector2structvalue type

Normalize(...)値型を使用すると、そのコピーが正規化されます。そのため、2番目のケースでは機能します。元の値に割り当てた最初にコピーを正規化します。

お役に立てれば。

于 2012-06-19T10:01:04.910 に答える
5

Vector2値型の場合、プロパティゲッターは新しいコピーを返し、Normalize()そのコピーに適用しても元のコピーには影響しません。

つまり、vt.Velocityは同じオブジェクトではないため、一方に加えられた変更はもう一方には反映されません。

Vector2参照型の場合、探している動作が得られます。

于 2012-06-19T10:00:03.910 に答える
4

リストアイテム

Vector2あなたの場合は値型(構造体)だと思います。

その場合、最初の例では、プロパティvのget部分によって返されたコピーを取得し、Normalizeの呼び出し後にコピーがスコープ外になるため、コピーを呼び出しますが、事実上何もしません。VelocityNormalize

Vector2が参照型(クラス)であった場合、最初に新しいオブジェクトを作成してから、のset部分を使用して割り当てる必要がなくても、これは期待どおりに機能しますVelocity

可変構造体はであることを忘れないでください。構造体を常に不変にする場合は、このような問題に陥らないようにする必要があります。

于 2012-06-19T09:59:48.123 に答える
0

あなたの詳細を知らなくても、Vector2それは値型のように聞こえます。したがって、あなたはあなたへの参照ではVelocityなく、そのコピーを与えられます。

于 2012-06-19T10:00:08.497 に答える