C#中重载相等(==)运算符示例
作者:junjie 发布时间:2023-01-11 15:10:36
标签:C#,重载,相等,==,运算符
运算符重载一直是一个很诡异事情,因为在写代码的时候,不知道某个运算符有没有被重载过。在 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 不建议重载==,但是不建议并不代表不能用吧,这个设计太挫了…


猜你喜欢
- 概述现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。J
- 概述 这是一个自定义色盘,根据点,直线和圆的几何学加上hsv颜色模型完成技术点几何:圆的标准方程式:(x-a)²
- zookeeper集群配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读
- Menustrip控件是一个菜单栏控件,可以加载菜单栏,在很多系统中都有用到。本文介绍下该控件的一些属性的常用方式。在页面FormMain_
- 这篇文章主要介绍了RabbitMQ延迟队列及消息延迟推送实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 项目中遇到了下载文件文件名是中文而且还有空格如果不对连接进行处理下载就会报错要想解决这个问题只需对你的url 进行编码然后替换空格用编码表示
- 先给大家展示效果图,如果感觉还不错,请参考实例代码效果图如下所示:具体代码如下:private void initData() { Bmob
- C#中using指令的用法1.using指令using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空
- 目录概述代码实现完整代码概述在PC端用.NET开发一个蓝牙下载的程序。实现在PC上查找周围的蓝牙设备(主要是手机),并将PC上的文件通过蓝牙
- 在很多场景中我们需要验证时间日期的是否属于正确的格式,验证时间是否符合常规的。1、验证 yyyy-MM-dd HH:mm:dd 格式的日期S
- 大多数情况下你不需要访问者模式,但当一旦需要访问者模式时,那就是真的需要它了,这是设计模式创始人的原话。可以看出应用场景比较少,但需要它的时
- 本文实例讲述了Android判断网络类型的方法。分享给大家供大家参考,具体如下:判断网络类型是wifi,还是3G,还是2G网络,对不同的网络
- 本文实例讲述了Android编程实现自动检测版本及自动升级的方法。分享给大家供大家参考,具体如下:步骤:1.检测当前版本的信息Android
- C#提升管理员权限修改本地Windows系统时间在桌面应用程序开发过程中,需要对C盘下进行文件操作或者系统参数进行设置,例如在没有外网的情况
- 1. String对象不可改变的特性下图显示了如下代码运行的过程:String s = "abcd"; s = s.co
- 1、static关键字1.1 使用static关键字定义属性在讲解static定义属性操作之前,首先编写如下一道程序。现在定义一个表示中国人
- 前言基于安卓平台的连续滚动图像组件ContinuousScrollableImageView(https://github.com/Cutt
- 1、JDK:Java Development Kit,java开发工具包。http://www.oracle.com/technetwork
- 前置知识Kotlin协程不是什么空中阁楼,Kotlin源代码会被编译成class字节码文件,最终会运行到虚拟机中。所以从本质上讲,Kotli
- 背景最近引入了 Nacos Config 配置管理能力,说起来用法很简单,还是踩了三个坑。Nacos Config 的 nacos 的帐号密