C#属性如何真正起作用?

xde*_*000 3 c# properties

如果我有:

class Test
{
    private Vector2 v;

    public Vector2 Velocity
    {
        get { return v; }
        set { v = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

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();
Run Code Online (Sandbox Code Playgroud)

为什么我直接尝试在属性Velocity上调用Normalize它没有规范化并且使用tmp Vector2它是?

PS Vector2是一个结构:

public struct Vector2 : IEquatable<Vector2>
{
    public float X;
    public float Y;
    ...
    public void Normalize() {...}
}
Run Code Online (Sandbox Code Playgroud)

Tig*_*ran 6

这个问题与实际上属性如何相关.NET Framework,但是如何value types在.NET Framework中进行管理.

我使用CAD内核,即使从提供的代码中不清楚,我认为Vector2是一个struct(通常是快速分配/渲染的加速),所以它是一个value type

Normalize(...)值类型,你正常化复制它,这就是为什么在它的工作原理第二种情况下,导致第一你正常化副本,之后将其分配给原始值.

希望这可以帮助.


Fré*_*idi 5

如果Vector2值类型,则属性getter将返回新副本,并且应用于Normalize()该副本不会影响原始副本.

换句话说,v并且t.Velocity不是同一个对象,因此对一个进行的更改不会反映在另一个对象中.

如果Vector2引用类型,您将获得您正在寻找的行为.