C#不可变类和游戏对象

C#不可变类和游戏对象,c#,immutability,C#,Immutability,我读了一些关于在java中创建不可变对象的书,我想知道,在某些情况下创建可变对象可以吗 例如,假设我们在C#中创建一个乒乓球游戏,显然,我们会有一个代表一个球的类,两个桨,你会这样写这个球类吗: class Ball { private readonly int xPosition; private readonly int yPosition; private readonly int ballSize; private

我读了一些关于在java中创建不可变对象的书,我想知道,在某些情况下创建可变对象可以吗

例如,假设我们在C#中创建一个乒乓球游戏,显然,我们会有一个代表一个球的类,两个桨,你会这样写这个球类吗:

 class Ball
    {
        private readonly int xPosition;
        private readonly int yPosition;
        private readonly int ballSize;
        private readonly string ballColor;

        public Ball(int x, int y, int size, string color)
        {
            this.xPosition=x;
            this.yPosition=y;
            this.ballSize = size;
            this.ballColor = color;
        }

        public int getX
        {
            get
            {
                return this.xPosition;
            }
        }
        //left out rest of implementation.
    class Ball
    {
        private int xPosition;
        private int yPosition;
        private int ballSize;
        private string ballColor;

        public Ball(int x, int y, int size, string color)
        {
            this.xPosition=x;
            this.yPosition=y;
            this.ballSize = size;
            this.ballColor = color;
        }

        public int getX
        {
            get
            {
                return this.xPosition;
            }

            set
            {
                this.xPosition = value;
            }
        }


    }
}
或者像这样:

 class Ball
    {
        private readonly int xPosition;
        private readonly int yPosition;
        private readonly int ballSize;
        private readonly string ballColor;

        public Ball(int x, int y, int size, string color)
        {
            this.xPosition=x;
            this.yPosition=y;
            this.ballSize = size;
            this.ballColor = color;
        }

        public int getX
        {
            get
            {
                return this.xPosition;
            }
        }
        //left out rest of implementation.
    class Ball
    {
        private int xPosition;
        private int yPosition;
        private int ballSize;
        private string ballColor;

        public Ball(int x, int y, int size, string color)
        {
            this.xPosition=x;
            this.yPosition=y;
            this.ballSize = size;
            this.ballColor = color;
        }

        public int getX
        {
            get
            {
                return this.xPosition;
            }

            set
            {
                this.xPosition = value;
            }
        }


    }
}
在我们的对象(球)可以改变位置、大小(根据级别变小或变大)和颜色的情况下,提供setter属性不是更好吗?在这种情况下,使其可变有意义吗?如何实现这一点?

如果您使用的是c#,则无需通过创建单独的字段来使对象不可变。相反,你可以这样做-

    class Ball
    {
         public Ball ( int x, int y, int size, string color) 
         { ... }
         public int XPos {get; private set; }
         public int YPos {get; private set; }
         public int Size {get; private set; }
         public string BallColor {get; private set; }
    }
这样,您仍然可以在类中编写方法来改变属性,但类之外的任何东西都不能改变它们的值。

如果您使用的是c#,则不需要通过创建单独的字段来使对象不可变。相反,你可以这样做-

    class Ball
    {
         public Ball ( int x, int y, int size, string color) 
         { ... }
         public int XPos {get; private set; }
         public int YPos {get; private set; }
         public int Size {get; private set; }
         public string BallColor {get; private set; }
    }

这样,您仍然可以在类中编写方法来改变属性,但类之外的任何东西都不能改变它们的值。

如果乒乓球像砖块一样在空中漂浮,那么就可以了。换句话说,如果它不移动,则使其不变。但是一个不移动的乒乓球并没有多大乐趣,所以可能是可变的,包括二传手所以我的第二种方法是合乎逻辑的,对吗?如果乒乓球像砖块一样漂浮在空中,那就没问题了。换句话说,如果它不移动,则使其不变。但是一个不移动的乒乓球并没有多大乐趣,所以可能是可变的,包括二传手所以我的第二种方法是合乎逻辑的,对吗?啊,正是我所想的,但是,只是想确定一下。回答接受!它是如何解决“在我们的对象(球)可以改变位置、大小(根据级别变小或变大)和颜色的情况下,提供setter属性不是更好吗?在这种情况下,使其可变是有意义的?您将如何处理?”。如果您只需
ball.XPos=…
就可以在ball类中添加Move(intx,inty)等函数,让您将球移动到特定位置。在实际设置属性值之前,可以对这些函数中的输入等进行自定义验证。这样可以限制其他类如何与球交互instance@KnightFox是的,
Move()
就足够了,尽管验证器可以在setter.Nice中。这里有一个+1AH,正是我想要的,但是,只是想确定一下。回答接受!它是如何解决“在我们的对象(球)可以改变位置、大小(根据级别变小或变大)和颜色的情况下,提供setter属性不是更好吗?在这种情况下,使其可变是有意义的?您将如何处理?”。如果您只需
ball.XPos=…
就可以在ball类中添加Move(intx,inty)等函数,让您将球移动到特定位置。在实际设置属性值之前,可以对这些函数中的输入等进行自定义验证。这样可以限制其他类如何与球交互instance@KnightFox是的,
Move()
就足够了,尽管验证器可以在setter.Nice中。这里有一个+1