代码之家  ›  专栏  ›  技术社区  ›  Nate CSS Guy

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

  •  2
  • Nate CSS Guy  · 技术社区  · 15 年前

    考虑到xna框架到处都使用struct,我想知道您建议如何设计一个类?

    例如,尽管类,它可能需要在类之外访问vector2和矩形(都定义为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 回复  |  直到 15 年前
        1
  •  6
  •   Joel Martinez    15 年前

    或者,把这个扔出去…把场地暴露出来。公开一个公共领域本质上没有什么错。

    例如,如果您的实体为其位置公开一个vector3,以便其他对象可以在自己的计算中使用该值…把它暴露出来。否则,如果没有其他类或实体需要知道位置,则根本不要公开它:-)

    以下是一些明智的建议 Rico Mariani :

    总的来说,我的感觉是房地产被高估了,而土地利用率却严重不足。我有没有提到不是每个人都同意这个立场?:)

        2
  •  5
  •   BFree    15 年前

    向item类添加一个方法,如下所示:

    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() 等。。

        3
  •  3
  •   Bob    15 年前

    你可以把 struct 也:

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

    像这样使用:

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