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

作者:junjie 时间:2023-01-11 15:10:36 

运算符重载一直是一个很诡异事情,因为在写代码的时候,不知道某个运算符有没有被重载过。在 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 不建议重载==,但是不建议并不代表不能用吧,这个设计太挫了…

标签:C#,重载,相等,==,运算符
0
投稿

猜你喜欢

  • java 二分法算法的实例

    2023-04-25 05:04:05
  • Java Swing实现窗体添加背景图片的2种方法详解

    2021-10-26 19:01:18
  • SpringBoot返回Json对象报错(返回对象为空{})

    2022-06-30 03:31:19
  • SpringBoot集成POI实现Excel导入导出的示例详解

    2022-12-05 19:09:10
  • Java基础知识之CharArrayReader流的使用

    2023-02-12 10:40:29
  • Kafka 日志存储实现过程

    2021-11-01 05:04:00
  • SpringBoot控制配置类加载顺序方式

    2022-08-18 04:31:15
  • springboot集成shiro详细总结

    2022-07-12 14:56:17
  • C#如何快速释放内存的大数组详解

    2021-12-14 18:42:33
  • Java针对ArrayList自定义排序的2种实现方法

    2022-01-30 03:47:34
  • C#泛型约束的深入理解

    2023-02-21 09:32:19
  • java中replaceAll替换圆括号实例代码

    2023-09-30 16:29:54
  • 详解android 用webview加载网页(https和http)

    2021-12-29 11:14:30
  • Java多线程产生死锁的必要条件

    2023-04-02 00:20:24
  • 提示信息控件AlertDialog对话框详解

    2022-04-18 22:20:45
  • Android UI控件之Gallery实现拖动式图片浏览效果

    2023-02-06 13:22:01
  • Android自定义gridView仿头条频道拖动管理功能

    2022-09-08 00:11:41
  • C#获取CPU编号的方法

    2022-01-05 10:57:37
  • Java中的回调

    2023-11-16 01:55:58
  • springboot 返回json格式数据时间格式配置方式

    2023-12-17 23:27:10
  • asp之家 软件编程 m.aspxhome.com