gpt4 book ai didi

c# - 应用于类的不变性

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:22 25 4
gpt4 key购买 nike

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

如果我改为上课怎么办:

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)));
}
}

关于c# - 应用于类的不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30421770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com