返回顶部
首页 > 资讯 > 精选 >C#初学者对Equals方法的常见误解有哪些
  • 824
分享到

C#初学者对Equals方法的常见误解有哪些

2023-06-17 12:06:52 824人浏览 薄情痞子
摘要

本篇内容介绍了“C#初学者对Equals方法的常见误解有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们都知道,在C#的世界里存在两种

本篇内容介绍了“C#初学者对Equals方法的常见误解有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

我们都知道,在C#的世界里存在两种等同性。一种是逻辑等同性:如果两个对象在逻辑上代表同样的值,则称他们具有逻辑等同性。另一种是引用等同性:如果两个引用指向同一个对象实例,则称他们具有引用等同性。

众所周知,Object类型有一个名为Equals的实例方法可以用来确定两个对象是否相等。Object的Equals的默认实现比较的是两个对象的引用等同性。而Object的派生类ValueTpye重写了Equals方法,它比较的是两个对象的逻辑等同性。

也就是说,在C#里,引用类型的默认Equals版本关注的是引用等同性,而值类型关注的是逻辑等同性。当然,这并不总能满足我们的要求。所以每当我们更在意引用类型的逻辑等同性的时候,我们就应该重写Equals方法。

重写引用类型的Equals方法以改变其默认的比较方式的一个著名例子是String类。当我们写出“string1.Equals(string2)”这样的代码时,我们比较的不是string1和string2这两个引用所指向的是否为同一个实例(引用等同性),而是比较string1与string2所包含的字符序列是否相同(逻辑等同性)。

误解一:Equals方法和operator==具有相同的默认行为。

对于引用类型,如果没有为它重载==操作符,且其父类型也没有重写Equals方法,则这个引用类型Equals方法和operator==具有相同的默认行为,即它们比较的都是对象的引用等同性。然而对于值类型来说,就完全不是这么回事了!因为如果你没有为自定义值类型重载operator==的话,就不能写这样的代码“myStruct1 == myStruct2”,否则会得到一个编译错误,原因是值类型没有相等操作符重载的默认实现。

误解二:自定义类的Equals的方法默认实现将自动调用operator==方法,或operator==方法的默认实现将自动调用Equals方法。

经常听到有人说某某类型是引用类型,所以它的Equals方法的默认实现将自动调用operator==方法。这种说法完全是没有道理的。正如上文所说的,引用类型Equals方法的默认实现来自Object,而值类型的默认实现来自TypeValue,就算他们会使用==操作符,使用的也是Object或TypeValue的重载版本。

原则上来说,只要我们没有重写一个类的Equals方法,那么它就会继承其父类的实现,而父类是没有机会使用子类型的操作符重载的。同样,只要我们没有在一个类的==操作符重载中调用Equals方法,它是不会自动调用的。

误解三:值类型的默认Equals实现是对两个对象进行逐位比较的。

有些人认为值类型的Equals默认实现就是通过比较两个对象在内存中的位表示,即如果所有的二进制位都相等,则说明这两个对象“等同”。这是不准确的。因为其实值类型的Equals默认实现是对值类型的每个字段都调用该字段类型的Equals方法,如果所有字段的Equals方法都返回true,则他们才可能相等。来看一个例子:

class MyClass   {   public override bool Equals(object obj)   {   Console.WriteLine("MyClass的Equals方法被调用了。");   return true;   }   }   struct MyStruct   {   public MyClass Filed;   }   class Program   {   static void Main(string[] args)   {   MyStruct a;   MyStruct b;   a.Filed = new MyClass();   b.Filed = new MyClass();   Console.WriteLine(a.Equals(b));   }   }

很显然,a和b拥有完全不同的二进制位表示。但是最终打印的结果是:

MyClass的Equals方法被调用了。   True

这说明值类型的默认实现是通过调用字段的Equals方法来确定两个对象是否相等,而不是通过比较他们的二进制位是否一致来确定的。

误解四:Equals是非常基本、非常常用的方法,所以其默认的实现不存在性能问题。

对于引用类型,Equals的默认实现很简单,仅仅需要判断两个引用是不是同一种类型、两个引用指向的是不是同一块内存就可以了。所以其性能也没有问题。但是对于值类型,Equals的任务就没有这么简单了。它需要对两个对象的所有字段都做出比较,即逐字段调用字段类型的Equals。

由于在ValueType(值类型Equals方法默认实现的位置)中,不可能知道它所有的子类型都包含哪些字段,所以为了调用子类型字段的Equals方法,ValueType的Equals就需要使用反射技术。您可能已经看出来了,反射并不是一种性能友好的技术,所以值类型的Equals方法算不上高效。这也正是为什么微软推荐我们为自定义值类型重写Equals方法的原因。

“C#初学者对Equals方法的常见误解有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C#初学者对Equals方法的常见误解有哪些

本文链接: https://lsjlt.com/news/289178.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#初学者对Equals方法的常见误解有哪些
    本篇内容介绍了“C#初学者对Equals方法的常见误解有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们都知道,在C#的世界里存在两种...
    99+
    2023-06-17
  • php初学者常见的错误有哪些
    这篇“php初学者常见的错误有哪些”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“php初学者常见的错误有哪些”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下面让我们...
    99+
    2023-06-06
  • Java初学者的30个常见问题都有哪些
    Java初学者的30个常见问题都有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我可以用%除以一个小数吗? a += b 和 a = a + b 的效果有区...
    99+
    2023-06-17
  • pandas初学者容易犯的错误有哪些
    这篇文章给大家分享的是有关pandas初学者容易犯的错误有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用pandas自带的函数读取大文件第一个错误与实际使用Pandas完成某些任务有关。具体来说我们在实际...
    99+
    2023-06-25
  • c语言常见的语法错误有哪些
    C语言常见的语法错误包括:1. 缺少分号:在语句结束处没有加上分号;2. 括号不匹配:括号没有正确配对,例如缺少左括号或右括号;3....
    99+
    2023-08-19
    c语言
  • tomcat常见错误及解决方法有哪些
    在使用Tomcat时,常见的错误及解决方法包括:1. 端口占用错误:Tomcat默认使用8080端口,如果该端口被其他程序占用,则会...
    99+
    2023-09-13
    tomcat
  • 常见的AdobeFlex误解有哪些
    小编给大家分享一下常见的AdobeFlex误解有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!常见AdobeFlex误解在Qcon上,Adobe的JamesW...
    99+
    2023-06-17
  • PHP开发者常见的MySQL错误有哪些?
    1、使用MyISAM而不是InnoDBMySQL有很多的数据库引擎,单一般也就用MyISAM和InnoDB。MyISAM是默认使用的。但是除非你是建立一个非常简单的数据库或者只是实验性的,那么到大多数时候这...
    99+
    2024-04-02
  • ASP 语法基础:初学者常见问题的解答
    ASP(Active Server Pages)是一种服务器端脚本语言,用于创建动态且交互式的网页。它是一个基于文本的脚本技术,嵌入在 HTML 或 XML 文档中。 2. 如何运行 ASP 脚本? 要运行 ASP 脚本,您需要: 安装...
    99+
    2024-04-02
  • python学习中常见的误区有哪些
    这篇文章主要介绍“python学习中常见的误区有哪些”,在日常操作中,相信很多人在python学习中常见的误区有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python学习中常见的误区有哪些”的疑惑有所...
    99+
    2023-06-27
  • 常见的初级排序算法有哪些
    本篇内容主要讲解“常见的初级排序算法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“常见的初级排序算法有哪些”吧!前言相信所有的程序员刚开始接触到的算法都会...
    99+
    2024-04-02
  • c++代码中的常见错误有哪些
    在C++代码中,常见的错误包括以下几种:1. 语法错误:例如拼写错误、缺少分号、缺少括号等。2. 逻辑错误:例如算法错误、条件判断错...
    99+
    2023-09-29
    c++
  • 常见HTML5的错误用法有哪些
    这篇文章主要介绍了常见HTML5的错误用法有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、使用section作为div的替代品人们在...
    99+
    2024-04-02
  • SQL的常见错误用法有哪些
    今天小编给大家分享一下SQL的常见错误用法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、LIMIT 语句分页查询是...
    99+
    2023-06-28
  • Node.js WebSocket中的常见的错误及解决方法有哪些?
    如何处理错误 在Node.js WebSocket中,错误可以通过error事件来处理。error事件会在连接出现错误时触发,并且会传入一个Error对象。 // 监听error事件 socket.on("error", (error)...
    99+
    2024-02-06
    :Node.js WebSocket 错误 处理 避免 调试
  • JAVA语言的常见误解有哪些
    这篇文章主要介绍JAVA语言的常见误解有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.JAVA是HTML的扩充JAVA是一个编程语言,HTML是一个页面描述语言。除了新版本HTML可以在WEB页中插入JA-V...
    99+
    2023-06-03
  • 常见php错误和诊断方法有哪些
    这篇文章主要介绍了常见php错误和诊断方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇常见php错误和诊断方法有哪些文章都会有所收获,下面我们一起来看看吧。语法错误语法错误是PHP程序中最常见的错误之一...
    99+
    2023-07-05
  • C# foreach使用中常见的错误有哪些
    这篇文章主要讲解了“C# foreach使用中常见的错误有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C# foreach使用中常见的错误有哪些”吧!在做项目时经常会碰到用C# for...
    99+
    2023-06-17
  • C语言初学者使用的编程软件有哪些
    这篇文章主要介绍“C语言初学者使用的编程软件有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言初学者使用的编程软件有哪些”文章能帮助大家解决问题。  1、Dev C++  dev-...
    99+
    2023-06-27
  • C语言中动态内存管理初学者容易犯的错误有哪些
    这篇“C语言中动态内存管理初学者容易犯的错误有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中动态内存管理初学者容...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作