我刚刚编写了一个可变的Point
类,尝试使用C#6的新功能时遵循这些准则。
public class Point
{
public int X, Y;
public static Point Zero => new Point(0, 0);
public static Point Up => new Point(0, -1);
public static Point Down => new Point(0, 1);
public static Point Left => new Point(-1, 0);
public static Point Right => new Point(1, 0);
public Point(int x, int y)
{
X = x;
Y = y;
}
public static Point operator +(Point a, Point b) => new Point(a.X + b.X, a.Y + b.Y);
public static Point operator -(Point a) => new Point(-a.X, -a.Y);
public static Point operator -(Point a, Point b) => a + -b;
public override bool Equals(object o) => Equals(o as Point);
public bool Equals(Point p) => (X == p?.X) && (Y == p?.Y);
public override int GetHashCode() => X ^ Y;
public static implicit operator string(Point a) => $"Point({a.X}, {a.Y})";
public override string ToString() => this;
}
这部分代码的计算结果为false
Point.Zero == Point.Zero
我完全知道为什么会这样做,但问题是应该将其评估为假吗?它只是不太适合我。我的Point
课程是否正确遵循了指导方针?
编辑:我只是不知道它是否应该评估为false。我想知道人们认为它应该评估什么。
编辑2:如何判断一个类是否应该是可变的?
该==
除非它是覆盖不自动调用等号。它将==
在其基类上调用运算符,在您的情况下为object
。该==
运营商object
使用引用相等,所以你问如果两个Point
引用是相等的,而你的情况,他们都没有,因为你的静态方法返回一个新的各个时刻。
因此,鉴于:
它应该评估为假吗?
根据您编写课程的方式,是的,应该。如果您不希望它的值为假,则需要进行一些更改。
我的Point班是否正确遵循指导方针?
您尚未覆盖==
,因此它将使用默认行为,该行为遵循该准则。如果使Point
不可变,则覆盖==
将是适当的。
如果你不希望Point.Zero == Point.Zero
返回false,这里有一些方法来做到这一点:
Equals
而不是==
暗含重视平等Zero
,Up,
等等,然后返回它们,而不是创建新的实例。Point
为struct
默认情况下将使用值相等而不是引用相等的a。请注意,如果将其更改Point
为a,struct
则还应使其不可变。可变结构的使用可能具有挑战性,因为它们在传递时会被复制。因此,如果更改属性值,则将更改结构副本的属性值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句