C# XNA';s Vector2类,属性在尝试更改其值时返回错误

C# XNA';s Vector2类,属性在尝试更改其值时返回错误,c#,properties,xna,accessor,C#,Properties,Xna,Accessor,我将首先用一些代码说明我的问题: class ExampleClass { private Vector2 _myVector; public Vector2 MyVectorProperty { get { return _myVector; } set { _myVector = value; } } private void MyMethod() { _myVector = Vector2.Zero; // Setting to zero

我将首先用一些代码说明我的问题:

class ExampleClass
{
    private Vector2 _myVector;

    public Vector2 MyVectorProperty { get { return _myVector; } set { _myVector = value; } }

    private void MyMethod()
    {
        _myVector = Vector2.Zero; // Setting to zero

        MyVectorProperty.X = 5; //Cannot modify the expression because it is not a variable (returns an error)

        _myVector.X = 5; //Works fine!
    }
}
如您所见,在尝试使用属性更改向量上的X和Y的值时,出现错误“无法修改表达式,因为它不是变量”。我不确定为什么会发生这种情况,也没有在网上看到任何运气,我想知道为什么会发生这种情况,以及如何(如果)修复它


另一个子问题是,当在它们所属的类中工作时,使用公共属性还是私有/受保护字段是一种良好的编程实践吗?

Vector2
是一个结构(值类型),因此您的属性返回
\u myVector
的值(即副本),您不能更改它

您应该很高兴编译器不允许您这样做,否则您会对操作的结果丢失感到非常惊讶

  • MyVectorProperty
    是属性-这意味着获取值是对返回值的函数的调用(类似于
    this.get\u MyVectorProperty()
  • 由于
    MyVectorProperty
    的类型是Vector2,它是struct,这意味着
    get.
    函数返回的值是值的副本,而不是普通类中的引用
  • 更改上述副本的字段
    X
    只会更改值副本内部的X,并且由于该值副本未分配给任何对象,因此它将丢失