C# 如何设置属性的成员?

C# 如何设置属性的成员?,c#,xna,C#,Xna,我有这样一个向量的性质 public Vector2 TestVector { get { return testvector; } set { testvector = value; } } 向量2有成员X和Y 当我想将property.x和property.y设置为值时,它不起作用 // this does not work TestVector.X = 10; 我该如何解

我有这样一个向量的性质

    public Vector2 TestVector
    {
        get { return testvector; }

        set
        {
            testvector = value;

        }
    }
向量2有成员X和Y

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

// this does not work
TestVector.X = 10;
我该如何解决这个问题

编辑:我看到我得到的答案是说它是一个结构,但实际上我有一个虚构的类叫做dVector2,它是一个类类型而不是结构,我使用它。为了简单起见,我把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;
是一个结构(值类型)。下面是您尝试
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;

@乔纳森击败我指出你有一个结构

我想补充一点,一般来说,拥有一个可变结构是不明智的。由于价值语义学的存在,这导致了各种各样的复杂性

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

如果使用C#struct,它应该是不可变的。易变的结构会引起各种各样的麻烦;不要这样做。如果我必须重新设计C语言,我会说可变结构必须用'mutable'关键字进行标记


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

我想补充一点,一般来说,拥有一个可变结构是不明智的。由于价值语义学的存在,这导致了各种各样的复杂性

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

如果使用C#struct,它应该是不可变的。易变的结构会引起各种各样的麻烦;不要这样做。如果我必须重新设计C语言,我会说可变结构必须用'mutable'关键字进行标记


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

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

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

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

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

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

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

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

对于“它不起作用”的解释,唯一的建议是“以某种方式修复它”。有什么特别的例外吗?或者VS只是说你“我不工作”?对于“它不工作”的解释,唯一的建议是“所以,以某种方式解决它”。有什么特别的例外吗?或者VS只是说你“我不会工作”?责怪XNA框架。但同样的问题也存在于结构中,等等。你是对的,一般来说,最好避免可变结构。然而,在游戏开发环境中(如XNA),这是一个必要的邪恶-通常是出于性能原因(我们不能随意创建堆对象,加上我们经常使用以特定方式打包的缓冲区)。如果你花时间充分理解可变结构的语义,它就不是“邪恶的”。只是他们的行为与一般开发人员预期的大不相同,这会导致问题。我读了一篇关于.NET Framework的一个关键部分的设计讨论的博文,该部分也进行了类似的性能讨论。它与线程信号有关,但我不记得确切的上下文或链接。他们的底线是一样的。。。如果您需要最后一盎司的性能,请在适当的地方使用结构,并确保处理代码的每个人都真正理解它们。但同样的问题也存在于结构中,等等。你是对的,一般来说,最好避免可变结构。然而,在游戏开发环境中(如XNA),这是一个必要的邪恶-通常是出于性能原因(我们不能随意创建堆对象,加上我们经常使用以特定方式打包的缓冲区)。如果你花时间充分理解可变结构的语义,它就不是“邪恶的”。只是他们的行为与一般开发人员预期的大不相同,这会导致问题。我读了一篇关于.NET Framework的一个关键部分的设计讨论的博文,该部分也进行了类似的性能讨论。它与线程信号有关,但我不记得确切的上下文或链接。他们的底线是一样的。。。如果您需要最后一点性能,请在适当的地方使用structs,并确保处理代码的每个人都真正理解它们。