XNA类设计使用Structs作为属性和问题,因为它们是值类型而不是引用类型

时间:2010-03-23 03:26:41

标签: c# .net xna

我想知道你如何建议设计一个类,因为XNA Framework在整个地方都使用了Struct?

例如,一个spite类,可能需要在类外部访问Vector2和Rectangle(都定义为Struct)。

当您尝试编写如下代码时会出现问题:

class Item 
{
    public Vector2 Position {get; set;}
    public Item() { Position = new Vector2(5,5); }
}

Item i = new Item();
i.Positon.X = 20; // fails with error 'Cannot modify the return value of Item because it is not a variable.'

// you must write code like this
var pos = i.Position;
pos.X++;
i.Position = pos;

第二个选项可以编译并运行,但它只是难看。还有更好的方法吗?

3 个答案:

答案 0 :(得分:6)

或者,只是把它扔出去......只是露出场地。暴露公共领域没有任何内在错误。

例如,如果您的实体为其位置公开了一个Vector3,以便其他东西可以在自己的计算中使用该值...只需公开它即可。否则,如果没有其他类或实体需要知道该位置,请不要暴露它: - )

以下是来自Rico Mariani的一些圣人建议:

  

一般来说,我的感觉是属性被高估了,而且这些领域的利用率极低。我是否提到不是每个人都同意这个立场? :)

答案 1 :(得分:5)

在项目类中添加一个方法,例如:

public void Move(int xAmount, int yAmount)
{
   var newPosition = new Point(this.Position.X + xAmount, this.Position.Y + yAmount);
   this.Position = newPosition;
}

这样丑陋很好并且抽象化,所以你可以像这样调用方法:

i.Move(1,1)

将它向下移动到右边的一个像素。您可以使用此方法的变体,例如MoveRight() MoveLeft()等。

答案 2 :(得分:3)

你也可以抽象出struct

private Vector2 position;
public float X
{
    get
    {
        return position.X;
    }
    set
    {
        position.X = value;
    }
}

并像这样使用它:

Item i = new Item();
i.X = 20;