0

我有一个像这样的向量的属性

    public Vector2 TestVector
    {
        get { return testvector; }

        set
        {
            testvector = value;

        }
    }

Vector2 有成员 X 和 Y。

当我想将 property.x 和 property.y 设置为值时,它不起作用

// this does not work
TestVector.X = 10;

我该如何解决?

编辑:我看到我得到的答案说它是一个结构,但实际上我有一个名为 dVector2 的组成类,它是一个类类型而不是结构,我使用它。为了简单起见,我只是将vector2放在这里,但这适得其反。

4

3 回答 3

5

Vector2是一个结构(值类型)。因此,这是您尝试时发生的事情TestVector.X = 10

{
    Vector2 temp = get_TestVector();   // copy is made during return from
                                       // hidden call to property getter method

    temp.X = 10;                       // modifying the copy

                                       // copy is gone
}

最终结果是什么也没有发生

不幸的解决方案是:

TestVector = new Vector2 { X = 10, Y = TestVector.Y };

另一种可能适合您的情况的解决方案是简单地创建TestVector一个公共字段,而不是一个属性:

public Vector2 TestVector;
于 2012-08-03T02:34:32.850 回答
1

没有人提到的另一个解决方案是为您拥有的每个向量的 X 和 Y 创建一个访问器方法。

Public float TestVectorX
{
    get { return TestVector.X; }
    set { TestVector.X = value; }
}

Public float TestVectorY
{
    get { return TestVector.Y; }
    set { TestVector.Y = value; }
}

添加了更多代码,但没有额外的内存来每次声明一个新的向量,也没有因为完全公开而丢失封装。

于 2012-08-03T02:47:18.997 回答
0

@Jonathon 击败我指出你有一个结构。

我要补充一点,一般来说,拥有一个可变结构是不明智的。由于值语义,这会导致各种复杂情况。

一旦结构获得它的初始值,它们就应该是不可更改的(即没有公共设置器等)。

如果您使用 C# 结构,它应该是不可变的。可变结构会导致各种讨厌的问题;不要这样做。如果我不得不重新设计 C# 语言,我会说可变结构必须用“可变”关键字标记。

http://blogs.msdn.com/b/jaybaz_ms/archive/2004/06/10/152748.aspx

于 2012-08-03T02:38:06.090 回答