博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中==与Equals方法的区别
阅读量:6980 次
发布时间:2019-06-27

本文共 2019 字,大约阅读时间需要 6 分钟。

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 {
class Person { private string name; public string Name { get { return name; } set { name = value; } } public Person(string name) { this.name = name; } } class program { static void Main(string[] args) { 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)); object g = a; object h = b; Console.WriteLine(g == h); Console.WriteLine(g.Equals(h)); Person p1 = new Person("jia"); Person p2 = new Person("jia"); Console.WriteLine(p1 == p2); Console.WriteLine(p1.Equals(p2)); Person p3 = new Person("jia"); Person p4 = p3; Console.WriteLine(p3 == p4); Console.WriteLine(p3.Equals(p4)); Console.ReadLine(); } } }

输出结果:true ,true ,false ,true ,false ,false ,true ,true 。

总结如下:

    1、对于值类型,==和equals等价,都是比较存储信息的内容。

    2、对于引用类型,==比较的是引用类型在栈中的地址,equals方法则比较的是引用类型在托管堆中的存储信息的内容。
    3、对于string类要特殊处理,它是一个内部已经处理好了equals方法和==的类,故==和equals等价,都是比较存储信息的内容。
    4、对于一些自定义的类,我们有必要重载equals方法,否则它默认为基类的equals方法(基类没有重载Equals方法则为Object类中的Equals方法),他们的比较也为地址,而不是引用类型在托管堆中的存储信息的内容。

 

故我们就不难理解

以下输出了:

Person p1 = new Person("jia"); Person p2 = new Person("jia"); Console.WriteLine(p1 == p2);//输出False Console.WriteLine(p1.Equals(p2));//输出False

5、对于string我们有必要强调一下常量字符串与字符串变量的区别,请看一下例子:

// 常量字符串 string x = "should it matter"; //指向同一个地址,即所谓的常量池 string y = "should it matter"; object c = x; object d = y; Console.WriteLine(c == d);//输出True Console.WriteLine(c.Equals(d));//输出True // 字符串变量 string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });// 指向的地址不一样,是动态分配的 string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); object g = a; object h = b; Console.WriteLine(g == h);//输出False Console.WriteLine(g.Equals(h));//输出True

他们分配地址的方式不一样,string x = "should it matter"; 由于它的初始值是一个常量,所以其地址分配在托管堆上的静态存储区,即所谓的常量池,而楼主的string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o'}); 则不一样,它这是在托管堆上动态分配的地址。

转载地址:http://svjpl.baihongyu.com/

你可能感兴趣的文章
《淘宝店铺 大数据营销+SEO+爆款打造 一册通》一一2.6 营销推广助力提升销量...
查看>>
《CCNP SWITCH (642-813 )学习指南》一1.1 企业园区网设计概述
查看>>
企业如何搭建营销部门的大数据天文望远镜
查看>>
《Spark Cookbook 中文版》一1.4 在Amazon EC2上部署Spark
查看>>
《Python面向对象编程指南》——2.8 __new__()方法和不可变对象
查看>>
ROS机器人程序设计(原书第2版)第1章 ROS Hydro系统入门
查看>>
《Android平板电脑开发秘籍》——3.9节技巧:创建一个下拉列表式的ActionBar
查看>>
《软件工程(第4版?修订版)》—第1章1.4节软件工程涉及的人员
查看>>
剖析一个java对象初始化顺序问题
查看>>
《Python和Pygame游戏开发指南》——1.7 安装Pygame
查看>>
reveal.js实现html播放ppt的炫酷效果
查看>>
《HTML5 canvas开发详解(第2版)》——2.12 检查一个点是否在当前路径
查看>>
《深入理解Scala》——第2章,第2.1节学习使用Scala交互模式(REPL)
查看>>
在Tableau中自定义版块地图
查看>>
《黑客秘笈——渗透测试实用指南(第2版)》—第2章2.1节被动信息搜索——开源情报(OSINT)...
查看>>
《21天学通HTML+CSS+JavaScript Web开发(第7版)》——1.7 作业
查看>>
微服务,微架构[一]之springboot[helloWorld]
查看>>
MySql导入CSV文件或制表符分割的文件
查看>>
《机器学习与R语言(原书第2版)》一1.2 机器学习的使用与滥用
查看>>
Android Monkey原理探讨
查看>>