C#中重载相等(==)运算符示例

所属分类: 软件编程 / C#教程 阅读数: 47
收藏 0 赞 0 分享

运算符重载一直是一个很诡异事情,因为在写代码的时候,不知道某个运算符有没有被重载过。在 C++ 里面,运算符重载可以写在类的外面,当 intellisense 不工作的时候,找到一个运算符的重载函数是一件相当头疼的事情。这个问题在 C# 中改善了不少,因为运算符重载一定要写在类内,而且 intellisense 很强大。不过另一个问题又产生了……

先来看 C++ 中的“==”重载:

struct A{
 int x;
 int y;
};
 
inline
bool operator == (const A& a, const A& b){
 return a.x == b.x && a.y == b.y;
}

上面这段代码中,由于声明的关系,a 和 b 永远不可能为 NULL,所以直接调用 a.x 和 b.x 是没有问题的。

而在 C# 中:

struct A
{
 public int x, y;
 public static bool operator ==(A a, A b)
 {
  return a.x == b.x && a.y == b.y;
 }
 public static bool operator !=(A a, A b)
 {
  return !(a == b);
 }
}

这段代码是没问题的,因为 A 是 struct,而 struct 不可能为 null。但换成 class 就有问题了,比如:

class A
{
 public int x, y;
 public static bool operator == (A a, A b)
 {
  if (a == null && b == null)
  {
   return true;
  }
  if (a == null || b == null)
  {
   return false;
  }
  return a.x == b.x && a.y == b.y;
 }
 public static bool operator != (A a, A b)
 {
  return !(a == b);
 }
}

由于 reference type 可以为 null,所以要先检查 a 和 b 是不是 null,但是“a == null”这一句又会去调用“operator ==”,于是就无限递归下去了……想了很久都没想出来变通的方法,而且 System.String 的实现也很诡异:

public static bool operator == (string a, string b)
{
 return Equals(a, b);
}
public static bool Equals (string a, string b)
{
 return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
}

看上去也会无限递归的(Reflector 出来的,不一定准),很神奇……

虽然对于 Referece type 不建议重载==,但是不建议并不代表不能用吧,这个设计太挫了…

更多精彩内容其他人还在看

winform用datagridview制作课程表实例

这篇文章主要介绍了winform用datagridview制作课程表的方法,实例分析了WinForm实现课程表的结构、数据库及调用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#中winform控制textbox输入只能为数字的方法

这篇文章主要介绍了C#中winform控制textbox输入只能为数字的方法,包括使用keyPress事件限制键盘输入以及TextChanged事件限制粘贴等情况,来实现控制输入为数字的功能,需要的朋友可以参考下
收藏 0 赞 0 分享

C#省份城市下拉框联动简单实现方法

这篇文章主要介绍了C#省份城市下拉框联动简单实现方法,涉及字典的定义与索引的用法,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#处理MySql多个返回集的方法

这篇文章主要介绍了C#处理MySql多个返回集的方法,实现了对处理MySql多个返回集进行封装,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#无限参数的写法

这篇文章主要介绍了C#无限参数的写法,通过循环遍历再结合paras.Add方法实现无限参数的功能,是比较实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#反射应用实例

这篇文章主要介绍了C#反射应用,实例分析了通过反射实现多系统数据库的配置方法,是比较实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#窗体传值实例汇总

这篇文章主要介绍了C#窗体传值,实例形式汇总了静态变量传值、委托传值、对话框之间的传值等常见应用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#把数组中的某个元素取出来放到第一个位置的实现方法

这篇文章主要介绍了C#把数组中的某个元素取出来放到第一个位置的实现方法,涉及C#针对数组的常见操作技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#中Equality和Identity浅析

这篇文章主要介绍了C#中Equality和Identity浅析,本文先是讲解了Equality和Identity的定义,同时讲解了判断两个对象等价性的4种方法,需要的朋友可以参考下
收藏 0 赞 0 分享

在Linux上运行C#的方法

这篇文章主要介绍了在Linux上运行C#的方法,实例分析了Linux平台下Mono软件包的应用技巧,以及在此基础之上的C#运行方法,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多