操作符重载和不同类型

本文关键字:同类型 重载 操作符 | 更新日期: 2023-09-27 18:05:25

我有一个类Score,它将在与整数的比较中大量使用。我计划重载==操作符,以便按照下面的代码启用这些比较?

public class Score
{
    public Score(int score) {
        Value = score;
    }
    public static bool operator ==(Score x, int y) {
        return x != null && x.Value == y;
    }
    public static bool operator ==(int y, Score x)
    {
        return x != null && x.Value == y;
    }
}

这是操作符重载的合理使用吗?

我是否应该为操作符的左右两侧提供重载以允许对称使用?

操作符重载和不同类型

我可能会继续定义一个从intScore的隐式转换,这样当你处理相等性时,你只需要处理一个类型。

public static implicit operator Score(int value)
{
    return new Score { Value = value }; // or new Score(value);
}
// define bool operator ==(Score score1, Score score2)
// elsewhere 
Score score = new Score { Value = 1 };
bool isScoreOne = (score == 1);

当您定义自己的==操作符时,请记住继续定义!=,并覆盖EqualsGetHashCode

我确实认为使用操作符重载是一种奇怪的情况,但这是您的选择。

然而,我的主要观点是,如果你重载==,你也需要重载!=

如果重载!=,使用x != null比较x以检查它是否为空的部分将导致==操作符调用!=操作符。这本身不是问题,只要它不使用==比较,因为您将拥有一组递归调用,导致堆栈溢出。

然而,由于很多人在重载!=时将其实现为'not ==' -在你的情况下,这将导致堆栈溢出。

解决方案:特别是在重载==,!=和Equals()中,在比较null时最好使用use Object.ReferenceEquals(x, null);

通常当我看到重载操作符时,它会将该类与自身进行比较。因此,如果你有多个实例变量,你就会弄清楚如何比较这两个变量,以确定某个值是否相等,是否大于,是否小于,等等。

我不明白你为什么不这样做:

if(myScore.value == 5)
{
 //do stuff
}

"这是操作符重载的合理使用吗?"

如果它使你的代码更容易理解并且不会引起问题,我会说,是的,绝对的!可能还有其他方法,但如果这对你有效,我不觉得有什么问题。

"我是否应该为操作符的左右两侧提供重载,以允许对称使用?"

我认为除非你有特别的理由这样做,换句话说,如果你正在使用或需要它们,那么你就不需要它们。(YAGNI)我看到的唯一真正的例外是,如果你正在编写一个框架,你有一个很好的想法,别人会需要它。