应用于类的不变性
本文关键字:不变性 应用于 | 更新日期: 2023-09-27 17:50:30
我一直在阅读关于不可变类型的内容,以及不建议使用可变结构体的原因。
如果我有一个类呢:
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);
是的,不可变类在创建新版本时将返回一个新实例。例如,这就是所有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)));
}
}