【发布时间】:2018-12-30 19:47:55
【问题描述】:
这似乎非常基本,但我在这个特别的笔记上找不到任何其他答案。在 C# 中声明 == 运算符时,还必须声明 != 运算符。显然,每种情况都可能因类型而异,但如果一个类型具有显式相等或没有,那么将!= 简单地声明为!(a == b) 是否合理?有理由不这样做吗?例如:
public static bool operator ==(Point p1, Point p2)
{
return ((p1.X == p2.x) && (p1.Y == p2.Y));
}
public static bool operator !=(Point p1, Point p2)
{
return !(p1 == p2);
}
【问题讨论】:
-
显而易见的答案是,在 x86 汇编中,
a != b在两条指令中完成(CMP和JNE),而!(a == b)在三个指令中完成(CMP,@ 987654332@, 和NOT) -
@RezaAghaei - 谢谢!说得通。 @Powerlord - 因为
==在这种情况下比较两个字段...这是否会使我的==实现成为CMPCMPJNE和!=成为CMPCMPCMPJNE@ 987654343@?两次比较会是总共四次操作吗? -
如果两个不相等的事物不一定不相等,你就不会这样做。示例:下溢的两个计算可能既不相等,也可能不相等。 NaN、无穷大、N/As、NULL 也可能如此。
-
@DourHighArch 哦,当然 - 绝对只适用于明确的二进制相等。