这是正确的做法吗?

狐狸

我刚刚编写了一个可变的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而不是==暗含重视平等
  • 更改静态方法以每次返回相同的实例。有一个代表的实例ZeroUp,等等,然后返回它们,而不是创建新的实例。
  • 更改Pointstruct默认情况下将使用值相等而不是引用相等的a。

请注意,如果将其更改Point为a,struct则还应使其不可变。可变结构的使用可能具有挑战性,因为它们在传递时会被复制。因此,如果更改属性值,则将更改结构副本的属性值

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章