应用于 类 的不变性

Immutability as applied to classes

我一直在阅读不可变类型,以及不建议使用可变结构的内容。

如果我有 class 怎么办:

public class Vector
{
    public double X, Y;

    public void Rotate(double angle) 
    {
        double x = this.X; double y = this.Y;
        this.X = (float)((Math.Cos(angle) * x) - (Math.Sin(angle) * y)); 
        this.Y = (float)((Math.Sin(angle) * x) + (Math.Cos(angle) * y)); 
    }
}

所以这将被称为:

Vector v = new Vector(1,0);
v.rotate(Math.PI / 2.0);

在这种情况下,我应该这样写吗?

public class Vector
{
    public double X, Y;

    public Vector Rotate(double angle) 
    {
        double x = this.X; double y = this.Y;
        return new Vector((float)((Math.Cos(angle) * x) - (Math.Sin(angle) * y)), (float)((Math.Sin(angle) * x) + (Math.Cos(angle) * y)));
    }
}

被称为:

Vector v = new Vector(1,0);
Vector v2 = v.rotate(Math.PI / 2.0);

是的,不可变 class 将在您创建新版本时 return 一个新实例。例如,这就是所有 String 方法的工作原理。

但是,您还应该确保不能从外部更改这些属性。此外,当属性为 double:

时,没有理由将坐标向下转换为 float
public class Vector
{

    public double X { get; private set; }
    public double Y { get; private set; }

    public Vector(double x, double y)
    {
        X = x;
        Y = y;
    }

    public Vector Rotate(double angle) 
    {
        double x = this.X; double y = this.Y;
        return new Vector(((Math.Cos(angle) * x) - (Math.Sin(angle) * y)), ((Math.Sin(angle) * x) + (Math.Cos(angle) * y)));
    }
}