2

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

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 的值时,我收到错误“无法修改表达式,因为它不是变量”。我不确定为什么会发生这种情况并且在网上没有任何运气,我想知道为什么会这样以及如何(如果)我可以解决它?

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

4

2 回答 2

4

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

  • MyVectorProperty是属性 - 这意味着获取值是调用返回值的函数(类似于this.get_MyVectorProperty())。
  • 由于类型MyVectorProperty是 Vector2 结构,这意味着函数返回的值get_...是值的副本,而不是像普通类那样的引用。
  • 更改X上述副本的字段只会更改值副本内部的 X,并且由于该值的副本未分配给任何内容,因此它将丢失。
于 2012-06-20T23:45:48.637 回答
1

Vector2是一个结构(值类型),所以你的属性返回的值_myVector(即一个副本),你不能改变它。

于 2012-06-20T23:34:31.270 回答