Equals 方法只是在 System.Object 中定义的一个虚拟方法,它由任何选择执行该任务的类所重写。== 运算符是一个可由类重载的运算符,该类通常具有恒等行为。

对于未重载 == 的引用类型,该运算符会比较两个引用类型是否引用同一对象,而这恰好是 System.Object 中的 Equals 实现所做的工作。

对于未重载 == 的值类型,该运算符会比较这两个值是否"按位"相等,即是否这两个值中的每个字段都相等。当您对值类型调用 Equals 时,仍然会发生这一情况,但这一次,该实现是由 ValueType 提供的,并且使用反射进行比较,从而使比较速度比特定于类型的实现慢很多。

到此为止,二者是如此类似。二者之间的主要区别是多态。运算符被重载而不是被重写,这意味着除非编译器知道调用更为具体的版本,否则它只是调用恒等版本。为阐明这一点,请看下面这个示例:

using System;
public class Test
{
static void Main()
{
        // Create two equal but distinct strings
        string a = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
        string b = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
        Console.WriteLine (a==b);
        Console.WriteLine (a.Equals(b));
        // Now let's see what happens with the same tests but
        // with variables of type object
        object c = a;
        object d = b;
        Console.WriteLine (c==d);
        Console.WriteLine (c.Equals(d));
    }
}

结果是:
True
True
False
True

第三行是 False,原因在于编译器不知道 c 和 d 的内容都是字符串引用,因而只能调用 == 的非重载版本。因为它们是对不同字符串的引用,所以恒等运算符返回 False。

那么,应该如何区别使用这些运算符呢?我的准则是:对于几乎所有引用类型,当您希望测试相等性而不是引用一致性时,请使用 Equals。例外的情况是字符串 - 使用 == 比较字符串确实会使事情简单得多,而且代码可读性更好,但是 您需要记住,该运算符的两端都必须是类型字符串表达式,才能使比较正常进行。

对于值类型,我通常使用 ==,因为除非值类型本身包含引用类型(这种情况极为罕见),否则是恒等还是相等的问题无关紧要。

[作者:Jon Skeet]

转载于:https://www.cnblogs.com/chinadhf/archive/2006/01/01/309390.html

[转载] 什么时候应该使用 ==?什么时候应该使用 Equals?相关推荐

  1. c mysql 返回字符串长度_objective-c中字符串长度计算

    我们知道,在c语言中,使用sizeof ()计算在内存中占用的字节数, 引用string.h后,使用strlen()计算字符串的长度(不包含\0). 而在object-c中, "length ...

  2. [转载]Tensorflow 的reduce_sum()函数的axis,keep_dim这些参数到底是什么意思?

    转载链接:https://www.zhihu.com/question/51325408/answer/125426642 来源:知乎 这个问题无外乎有三个难点: 什么是sum 什么是reduce 什 ...

  3. u-boot中filesize环境变量【转载】

    转载地址:https://blog.csdn.net/fzs333/article/details/48518559 U-Boot中的环境命令可以使用$(filesize)来确定刚下载(传输)得到的文 ...

  4. linux常用命令(转载)

    Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短 ...

  5. makefile学习(转载)

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客: http://blog.csdn.net/haoel/article/details/2886 makefile很重 ...

  6. 浅谈UWB(超宽带)室内定位技术(转载)

    技术背景 随着无线通信技术的发展和数据处理能力的提高,基于位置的服务成为最有前途的互联网业务之一.无论移动在室内还是室外环境下,快速准确地获得移动终端的位置信息和提供位置服务的需求变得日益迫切.通信和 ...

  7. 【转载】浏览器事件循环机制(event loop)

    首先,本文转自https://juejin.im/post/5afbc62151882542af04112d 当我看完菲利普·罗伯茨的 javascript event loop的演讲的时候,就对于事 ...

  8. [转载]Surging 分布式微服务框架使用入门

    前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架 ...

  9. 负二项分布学习[转载]

    转自:https://wenku.baidu.com/view/b6518ea5112de2bd960590c69ec3d5bbfd0adaff.html 1.伯努利实验 2.二项分布 3.负二项分布 ...

  10. 【转载】tf.nn.conv2d_transpose是怎样实现反卷积的?

    原文链接:https://blog.csdn.net/mao_xiao_feng/article/details/71713358 转载于:https://www.cnblogs.com/Virtua ...

最新文章

  1. 如何查看静态库和动态库是32位还是64位
  2. 腾讯2019暑期实习生提前批CV岗笔试题
  3. Using dbms_shared_pool.purge to remove a single task from the library cache
  4. 八皇后时间复杂度_【算法打卡】N皇后
  5. 解决wordpress无法离线发布(远程发布)的故障
  6. mybatis更新时间字段_你以为把Mybatis型处理器了解了,就不会“暴雷”了!
  7. 自动将存储过程转成C#代码的过程[转]
  8. 诗与远方:无题(六十八)
  9. 从字节码看java中 this 的隐式传参
  10. 使用JMeter进行接口压力测试
  11. 用FFmpeg快捷加文字水印
  12. 炫酷恶趣强大的制作神器小程序源码_支持多种流量主模式
  13. 蛋白质二级结构预测Linux,蛋白质稳定性预测工具-Rosetta ddg_monomer
  14. Spring Cloud底层原理以及项目实战分析
  15. ARM 安装中文输入法
  16. QT使用QStackedWidget实现切页显示
  17. 笔记:腾讯云服务器的使用
  18. netterm linux,NetTerm终端仿真软件下载
  19. 14-HAL库之I2C通信
  20. 创业失败欠债一千多万,身无分文、妻离子散,靠父母的工资过活,怎么翻身?

热门文章

  1. Java 实现MapReduce函数
  2. 发现个很有意思的angularjs +grunt 复习项目
  3. 在 iOS 应用中实现飞行模式提醒
  4. [待总结]高频率vim命令
  5. Async Mode: Future使用
  6. 灰盒测试—数据库软件
  7. 精通机器学习的5本免费电子书(5 free e-books for machine learning mastery)
  8. MySQL多实例安装配置指南
  9. 【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高)...
  10. 一些或许用的到的小Demo