欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

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

时间:2021-03-10 09:24:54|栏目:.NET代码|点击:

运算符重载一直是一个很诡异事情,因为在写代码的时候,不知道某个运算符有没有被重载过。在 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#精确计算年龄的方法分析

栏    目:.NET代码

下一篇:C#基础概念二十五问 21-25

本文标题:C#中重载相等(==)运算符示例

本文地址:http://www.codeinn.net/misctech/77825.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有