返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#中==(双等于号)与equals()区别详解
  • 412
分享到

C#中==(双等于号)与equals()区别详解

2024-04-02 19:04:59 412人浏览 安东尼
摘要

这两种方式也是大家在日常编码工作当中用的比较多的判断方式、之前在使用的时候也没太关注两者在比较不同类型的时候存在哪些区别 今天就和大家一起深入了解一下其中区别 一、值类型比较判断 对

这两种方式也是大家在日常编码工作当中用的比较多的判断方式、之前在使用的时候也没太关注两者在比较不同类型的时候存在哪些区别

今天就和大家一起深入了解一下其中区别

一、值类型比较判断

对于值类型来说 两者之间比较的都是”内容”是否相同,即值类型中的数值是否一样,很显然此时两者是划等号的,代码展示如下:


#region 值类型判断
int i = 10;
int j = 10;
Console.WriteLine($"双等于号判断结果为:{(i == j)}");
Console.WriteLine($"Equals判断结果为:{i.Equals(j)}");
 
#endregion

控制台输出:

由此判断在值类型中使用int类型为例,其中等于号与Equals二者的判断不存在区别、都是比较其中的数值内容、那么引用类型存在区别吗一起来看一看?

二、引用类型比较判断

对于引用类型来说,等号(==)比较的是两个变量的”引用”是否一样,即是引用的”地址”是否相同。而对于equals来说仍然比较的是变量的”内容”是否一样

1、引用类型中字符串比较(String)


#region 引用类型中String比较
Console.WriteLine("----------------我是分割线-----------------------");
string str1 = "abd";
string str2 = "abd";
Console.WriteLine($"双等于号判断结果为:{(str1 == str2)}");
Console.WriteLine($"Equals判断结果为:{str1.Equals(str2)}");
#endregion

控制台输出:

那么问题来了?Equals是比较其中的数值相等返回True我可以理解、那么字符串中双等于号是比较二者之间的引用、很显然str1变量与str2变量是不同的引用

为什么返回的结果怎么还是True呢?实际的原因是什么呢?一起来看一看


//
// 摘要:
//     Determines whether two specified strings have the same value.
//
// 参数:
//   a:
//     The first string to compare, or null.
//
//   b:
//     The second string to compare, or null.
//
// 返回结果:
//     true if the value of a is the same as the value of b; otherwise, false.
public static bool operator ==(String? a, String? b);
 
 
//
// 摘要:
//     Determines whether this instance and another specified System.String object have
//     the same value.
//
// 参数:
//   value:
//     The string to compare to this instance.
//
// 返回结果:
//     true if the value of the value parameter is the same as the value of this instance;
//     otherwise, false. If value is null, the method returns false.
public bool Equals(String? value);

不管是==、还是Equals也好都是微软提供的public sealed class String密封类下面的提供的方法、看到此时还看不出其中的缘由、那么直接上反编译工具看一看究竟。

点击str3==str2中的等于号继续查看、发现反编译中查看这个方法的源码返回了Equals这个方法、这样一看就大致清楚了、string类型中微软的开发

人员对这个==进行的重写。

以上是Equals与==反编译源码所以这也就是当我们在比较String类型时、不同的引用、数值一样、Equals与==返回的结果一致、相同、所以在进行String类型判断

这两个方法内部本质是相同的、当然String类型是一个特例。

2、引用类型中自定义类型比较


#region 引用类型中自定义类型t比较
Console.WriteLine("----------------我是分割线-----------------------");
Car car1 = new Car()
{
    Age = 4,
    Color = "Green"
};
Car car2 = new Car()
{
    Age = 4,
    Color = "Green"
};
 
Console.WriteLine($"双等于号判断结果为:{(car1 == car2)}");
Console.WriteLine($"Equals判断结果为:{car1.Equals(car2)}");

控制台输出:

二者都是输出False、由于不同的引用实例、所以引用的地址也是不同的、即使数值相同==也会返回False、可能有人会产生疑问,car1 和car2的内容是相同的啊,为什么他俩的比较结果却是为false呢?。原因就在于在Equals是Object中的一个虚方法,而Car类中没有对它进行重写,因此此时调用的仍是父类中的Equals方法。但是父类是无法知道你都有哪些成员字段的,因此返回的是false。要想让他能够比较两个变量的内容是否相同,那就应该重写Equals方法

3、重写Equals并测试

新建类并测试代码如下:


public class TwoDPoint : System.Object
    {
        public readonly int x, y;

        public TwoDPoint(int x, int y) 
        {
            this.x = x;
            this.y = y;
        }

        public override bool Equals(System.Object obj)
        {
            if (obj == null)
            {
                return false;
            }

            TwoDPoint p = obj as TwoDPoint;
            if ((System.Object)p == null)
            {
                return false;
            }
            return (x == p.x) && (y == p.y);
        }

        public bool Equals(TwoDPoint p)
        {
            if ((object)p == null)
            {
                return false;
            }

            return (x == p.x) && (y == p.y);
        }

        public override int GetHashCode()
        {
            return x ^ y;
        }


    }

上端调用测试


#region 引用类型中自定义类型t比较
  Console.WriteLine("----------------我是分割线-----------------------");

  TwoDPoint twoDPoint1 = new TwoDPoint(4, 8);
  TwoDPoint twoDPoint2 = new TwoDPoint(4, 8);

  Console.WriteLine($"双等于号判断结果为:{(twoDPoint1 == twoDPoint2)}");
  Console.WriteLine($"Equals重写后判断结果为:{twoDPoint1.Equals(twoDPoint2)}");
  #endregion

控制台输出:

结果显示Equals重写后返回True、==引用的地址不同、所以还是返回False、由此可以证明重写后验证成功。

总结:Equals比较的永远是变量的内容是否相同,而= =比较的则是引用地址是否相同(前提:此种类型内部没有对Equals 或= = 进行重写操作,否则输出可能会有不同)

string类型是个特例,因为他的内部对这两个都进行了重写、以上本人亲测有效、有什么需要改善的欢迎大家提出来、我加以改正。有时候短短几行代码其实要细细研究还是会细思极恐

总而言之还是微软的大佬的给我们封装好了、我们拿来用就可以、但是在用的同时确实也需要有时间研究一下其中原理、其实可以多使用反编译工具研究一下其中代码原理、我这里使用的是ILSPY

到此这篇关于C#中==(双等于号)与equals()区别详解的文章就介绍到这了,更多相关C# 双等于号与equals()区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C#中==(双等于号)与equals()区别详解

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

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

猜你喜欢
  • C#中==(双等于号)与equals()区别详解
    这两种方式也是大家在日常编码工作当中用的比较多的判断方式、之前在使用的时候也没太关注两者在比较不同类型的时候存在哪些区别 今天就和大家一起深入了解一下其中区别 一、值类型比较判断 对...
    99+
    2024-04-02
  • python中is与双等于号“==”的区别示例详解
    前言 在开始本文之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识)、python type()(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较...
    99+
    2022-06-04
    示例 详解 区别
  • c语言中等于和双等于的区别
    c 语言中,“==”和“===”比较运算符的区别在于:“==”只比较值,而“===”同时比较值和类型。因此,使用“==”时不同类型的值可能相等,而使用“===”时只有值和类型都相等才返回...
    99+
    2024-04-27
    c语言
  • c语言中单等号和双等号的区别
    单等号 (=) 用于赋值,将右边值赋给左边变量;双等号 (==) 用于比较,判断两个操作数是否相等,返回 0(假)或 1(真)。 C 语言中单等号和双等号的区别 在 C 语言中,单等号...
    99+
    2024-05-02
    c语言
  • 如何在Java中使用双等于符号与equals()方法
    今天就跟大家聊聊有关如何在Java中使用双等于符号与equals()方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java 程序中测试两个变量是否相等有两种方式:一种是利用 ==...
    99+
    2023-05-31
    java equals() ava
  • c语言中等于和等于等于的区别
    在 c 语言中,"等于"(=)用于赋值,而 "等于等于"(==)用于比较。等于(=)运算符:将右侧值赋值给左侧变量。等于等于(==)运算符:比较两个值是否相等,返回布尔值(true/fa...
    99+
    2024-05-02
    c语言
  • JavaScript中三等号和双等号的区别是什么
    这篇文章给大家分享的是有关JavaScript中三等号和双等号的区别是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。三等号和双等号的区别// 双等号 - 将两个操作数转换为相同类...
    99+
    2023-06-27
  • Java中equals和==的区别详解
    目录1.java中的数据类型,可分为两类: 2.再稍微改动一下程序,会有更奇怪的发现: 3. 字符串缓冲池 4.再次更改程序: 总结1.java中的数据类型,可分为两类: 1.基本...
    99+
    2024-04-02
  • 详解Java中==和equals()的区别
    目录1. ==1.1 基本数据类型1.2 引用数据类型1.3 小结2. equals3. 总结1. == == 是运算符,用来判断两个值是否相等,==可以使用在基本数据类型变量和引用...
    99+
    2024-04-02
  • PHP中单引号和双引号的区别详解
    目录PHP中单引号和双引号简介PHP中字符串和变量插值时单引号和双引号的区别PHP中转义撇号时单引号和双引号的区别补充知识:字符串内部如果出现PHP引号怎么办--关于转义.总结本文将...
    99+
    2023-01-15
    php单引号和双引号区别在哪 php单双引号的区别 php中双引号和单引号
  • php中恒等与等于的区别是什么
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php中恒等与等于的比较等式(==)运算等式(==)运算符是比较、并测试左边的变量(表达式或常量)是否与右边的变量(表达式或常量)具有相同的值;该运算符进行的比较是松散...
    99+
    2019-04-27
    php 恒等 等于 === ==
  • php中恒等与等于的区别有哪些
    这篇文章主要介绍“php中恒等与等于的区别有哪些”,在日常操作中,相信很多人在php中恒等与等于的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中恒等与等于的区别有哪些”的疑惑有所帮助!接下来...
    99+
    2023-06-29
  • c语言中单双引号的区别
    c 语言中,单引号定义字符常量,双引号定义字符串常量。单引号还能定义预处理器宏,其范围和优先级与双引号不同。虽然两者均可定义字符串,但建议优先使用双引号,因为它支持转义字符。 C 语言...
    99+
    2024-05-02
    c语言 作用域 字符串常量
  • oracle中双引号与单引号的区别在哪
    oracle 数据库中,双引号引用对象标识符(如表名),单引号定义字符串文字。单引号字符串中的单引号需转义,区分大小写,不能字符拼接;双引号字符串不区分大小写,可拼接。 Oracle ...
    99+
    2024-05-07
    oracle
  • C#中struct与class的区别详解
    目录1.最大的区别2.struct成员无法被声明为protected。3.struct是隐式的sealed类4.struct中无法重载默认构造函数5.关于对象的初始化6.结构体没有析...
    99+
    2024-04-02
  • c语言中单引号和双引号有区别吗
    c语言单双引号的区别:字符常量:单引号表示单个字符,双引号不能使用。字符串常量:双引号表示字符串,单引号不能使用。转义字符:单引号内转义字符生效,双引号内不生效。嵌套:双引号可嵌套在单引...
    99+
    2024-04-27
    c语言 字符串常量
  • php中的单引号与双引号有什么区别
    这篇文章主要介绍“php中的单引号与双引号有什么区别”,在日常操作中,相信很多人在php中的单引号与双引号有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中的单...
    99+
    2024-04-02
  • oracle中双引号与单引号的区别是什么
    oracle 中双引号和单引号用于包围字符串值,主要区别在于:用途:单引号用于字符串文字,双引号用于数据库对象名称、包含单引号文本以及区分大小写标识符。标识符命名:单引号内不区分大小写,...
    99+
    2024-05-07
    oracle
  • C#中括号强转、as、is区别详解
    目录1. 括号强转2.is3. as转换C#是一门强类型语言,一般情况下最好避免将一个类型转换成另一个类型,但是有些时候又不得不进行类型转换,那么就出现几种强转方式。 1. 括号强转...
    99+
    2023-02-06
    C#括号强转 C# as C# is
  • 关于C语言strlen与sizeof区别详情
    目录一.sizeof详解1.sizeof()作用2.sizeof3.sizeof ()4.sizeof()与数组名的关系5.sizeof()返回类型造成的坑二.strlen详解三.s...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作