在比较Equals 和 ==的区别前。我们先来了解下相关的知识

C#数据类型

1、值类型

值类型有:

  值类型包括:简单类型、结构类型、枚举类型。

  byte(1)、sbyte(1)、short(2)、ushort(2)、int(4)、uint(4)、long(8)、ulong(8)、float(4)、double(8)、decimal(8)、char、bool、枚举、结构。

  上述中括号中的数字表示字节数,byte、ushort、uint、ulong 为无符号类型(没有负数),顺便说一下 sbyte 是有符号的字节。

2、引用类型

  引用类型有:对象(Object)类型、类类型、接口、代表元、字符串类型、数组。

new 运算符

在 C# 中, new 关键字可用作运算符、修饰符或约束。

1、 new 运算符

  用于创建对象和调用构造函数。

2、new 修饰符

  用于向基类成员隐藏继承成员。

3、new 约束

  用于在泛型声明中约束可能用作类型参数的参数的类型。

需注意一点:凡是用new运算符就会在堆内存中开辟空间存放引用(引用地址存放在栈上)对象的值

==  和 Equals 的区别

  1. == 是一个运算符。

  2.Equals则是string对象的方法,可以.(点)出来。

我们比较无非就是这两种 1、基本数据类型比较  2、引用对象比较

1、基本数据类型比较

  ==和Equals都比较两个值是否相等。相等为true 否则为false;

2、引用对象比较  

  ==和Equals都是比较栈内存中的地址是否相等 。相等为true 否则为false;

需注意几点:

  1、string是一个特殊的引用类型。对于两个字符串的比较,不管是 == 和 Equals 这两者比较的都是字符串是否相同;

  2、当你创建两个string对象时,内存中的地址是不相同的,你可以赋相同的值。

    所以字符串的内容相同。引用地址不一定相同,(相同内容的对象地址不一定相同),但反过来却是肯定的;

  3、基本数据类型比较(string 除外) == 和 Equals 两者都是比较值;

接下来我们来挨个挨个看实例:

  1、基本数据类型比较:==  和 Equals 都比较具体的值

            int i1 = 8;int i2 = 8;bool bo1 = i1 == i2; //truebool bo2 = (object)i1 == (object)i2; // 装箱后变成引用类型,引用不同 故为falsebool bo3 = (i1).Equals(i2); //true 比较的是值

2、来看一个地址不同,内容相同的比较。== 比较地址, Equals比较值

            //使用了new运算符就会在内存中创建对象,地址是不相同的。字符串内容相同string str3 = new string(new char[] { 'a', 'b', 'c' });string str4 = new string(new char[] { 'a', 'b', 'c' });bool b3 = (object)str3 == (object)str4; //false  转化成object后  是比较地址,这里内存中的地址是不相同的bool b4 = ((object)str3).Equals((object)str4); //true 此时Equals依然是比较值

3、string字符串比较:==  和 Equals 同样也是比较具体的值

           //string是特殊的引用类型。只要是字符串比较,不管是"=="还是"Equals"都是比较字符串的内容 string str1 = "abc";string str2 = "abc";bool b1 = str1 == str2;  //truebool b2 = str1.Equals(str2); //true//使用了new运算符就会在内存中创建对象,地址是不相同的。字符串内容相同string str3 = new string(new char[] { 'a', 'b', 'c' });string str4 = new string(new char[] { 'a', 'b', 'c' });bool b3 = str3 == str4; //true  字符串比较 是比较具体的值,这里内存中的地址是不相同的bool b4 = str3.Equals(str4); //truebool b5 = str1 == str3; //truebool b6 = (str1).Equals(str3); //trueobject str5 = "abc";  //定义一个变量 str5并赋值为 abcobject str6 = "abc";  //定义一个变量 str6并指向字符串abcbool b7 = str5 == str6;  //truebool b8 = (object)str5 == (object)str6;  //但这样就是比较引用是否相同,因为str5 和 str6 引用同一个实例 即为 truebool b9 = str5.Equals(str6); //true

在上个列子中b3和b4都是true,我们来看看str3和str4在内存中的地址是否相等?其实是不相等的。用new操作符创建的对象都会在内存中分配一个新的内存地址,同时也可以证明这里比较的是值,而不是地址;更进一步证明相同内容的对象地址不一定相同。

如何调出内存窗口?如图:(启动调试后,这里可以调出多个内存窗口)用来比较地址

4、引用类型比较: ==和Equals都是比较栈内存中的地址是否相等

class MyClass{public string name;public MyClass(string name){this.name = name;}}
   //------------------------测试-----------------------------MyClass str7 = new MyClass("abc");  MyClass str8 = new MyClass("abc");bool b10 = str7 == str8;  //这里是引用类型比较(不是string字符串比较)所有比较是不是对同一个对象的引用,这里显然是内存中两个不同的引用对象。故为falsebool b11 = str7.Equals(str8); //同上
MyClass str9 = str7; //str7的地址赋值给str9。bool bl2 = str7 == str9;  //true 引用同一个对象bool bl3 = str7.Equals(str9);  //trueobject str10 = new object();  object str11 = new object();  bool b12 = str10 == str11;  //falsebool b13=str10.Equals(str11);   //false

同样我们开看看str7 str8 str9 分别在内存中的地址,红框标记(str7,str9)可以看出地址是相等的

看到这里也许你疑惑了,既然引用类型比较 == 和Equals都是比较地址,那就没区别吗?

Equals是string类下的一个方法,既然知道它的来路。我们就可以看看它内部源码的实现,打开Reflector查找string。

找到Equals(Object obj) 和Equals(string value)

看到内部也是用==来实现的,并且看到Object的比较是转换成string后比较。

好了,继续来讲,在引用类型比较中,== 和Equals都是比较地址外,Equals突出的地方。一个对象除了地址相同。还有其他独有的特征。

比如我们要比较某人都来自中国(内存地址),并且都来自中国香港(内存地址独有的特征或性质),

当符合这两个条件我们才说明这个对象是相等的。那么此时 == 和Equals都无能为力。但Equals有它鹤立鸡群的地方。

查看Equals定义会发现,Equals是virtual方法:  public virtual bool Equals(object obj); 既然是virtual我们就可以重写Equals方法,来编写自己的业务逻辑

嗯!来编写一个测试类,并且override Equals方法

 class MyClass{public string country; //国家public string city;  //城市public MyClass(string country, string city){this.country = country;this.city = city;}public override bool Equals(object obj){string ci = ((MyClass)obj).city;string co = ((MyClass)obj).country;if (ci == "香港" && co == "cn")return true;return false;}}

测试:

            MyClass str7 = new MyClass("cn","香港");MyClass str8 = new MyClass("cn","香港");MyClass str18 = new MyClass("cn", "台湾");bool na = str7.Equals(str8); //truebool an = str7.Equals(str18); //false

最后谈谈这两个有什么区别:

            string str1 = "abc";string str3 = new string(new char[] { 'a', 'b', 'c' });

以上这两句话大家应该都见得多,比如str3这句笔试题居多,大体都是创建了几个string对象。回答理所当然是两个。一个是"abc"驻留,

一个是new string("abc")的时候在堆内存上的数据"abc",栈内存则保存了对"abc"的引用,不是对象。通俗一点就是栈上的引用地址指向堆中的值或内容。

来看看str1这句,这并没有创建对象。即没有在内存中分配空间。因为没有使用new运算符,这里仅仅是声明了一个指向对象的引用变量str1,暂时指向"abc",

所以这里只创建了一个string对象,所以要区分用new和没有用new的方式

看看下面这个列子是创建了3个对象。因为字符串是不可变的

         string x = "ab";string y = "a";string x = x + y;

不知道C#中有没有常量池这一概念。还有看到网上很多这样的 string str = new string("abc") 可我真的没找到stirng的这个重载函数

---------Equals 和 == 的区别末前就了解这么多。知识比较基础,阅历还不够。刚出来混的。不足之处还请多多指教,文明发言。共同学习。谢谢!

转载于:https://www.cnblogs.com/nsky/archive/2013/03/01/2939268.html

Equals 和 == 的区别相关推荐

  1. 【Java常识】6.0面向对象认知和Eclipse的实用使用、==号和equals方法的区别

    1.曾经写过很多自以为很通俗易懂的面向对象的解释. 如下是目前最通俗的一种解释: 2.Eclipse的补充解释. 运行的快捷键:F11. 3.Eclipse快捷键大全 大全放本文最后,这里主要放常用的 ...

  2. JAVA 中equals()与==的区别

    原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...

  3. c# equals与==的区别

    c# equals与==的区别 对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 ...

  4. 面试官:谈谈equals() 和 == 的区别

    引言 谈谈equals() 和 == 的区别,这是一个非常经典的问题,不是特别难,面试也时有问道:但是很多小伙伴在面试时脑子却一片空白,痛失offer:所以在这里我详细介绍一下这两者的区别,希望对你能 ...

  5. Java基础 抽象类和接口的区别、equals 与 == 的区别

    一.抽象类和接口有什么区别 抽象类与接口都用于抽象,但是抽象类可以有自己的部分实现,而接口规范某一行为,调用者实现这个接口. 主要区别: 1.抽象类还是类只能单继承,而接口却可以多实现. 2.抽象类满 ...

  6. 浅谈equals和==的区别

    基本数据类型 八大基本数据类型:Byte,short,int,long,double,folat,boolean,char 引用数据类型 四大基本数据类型:String,数组类型 [ ] ,class ...

  7. Java基础之equals和==的区别深入解析

    Java基础之equals和==的区别深入解析 以下是本文目录大纲 equals 和 == 的区别 equals 的重写 复写hashCode方法,有31这个数字的作用 1. equals 和 == ...

  8. equals()与==的区别

    "=="比较两个变量本身的值,即两个对象在内存中的首地址. "equals()"比较字符串中所包含的内容是否相同. 比如: String s1,s2,s3 = ...

  9. 处理对象(toString()方法详解和==与equals方法的区别)

    处理对象(toString()方法详解和==与equals方法的区别) toString()是一个非常特殊的方法,它是一个自我描述的方法.当程序员直接打印该对象的时候,系统会输出该对象的"自 ...

最新文章

  1. mysql 差异还原_MySQL差异转储? 还原的其他策略?
  2. 走,去谷歌的机房逛逛
  3. 深入理解C语言——#define宏和枚举的区别
  4. php response响应,9. 响应 (Response)
  5. 10.1 SQ03维护用户组
  6. HTTP/2 协议规范
  7. iOS 判断设备型号
  8. 深入剖析Linux IO原理和几种零拷贝机制的实现
  9. 【算法实践】搜狗信息流推荐算法交流.pdf(附下载链接)
  10. linux文件系统变为只读的修复
  11. 基于C语言实现NDVI处理
  12. 内网服务器putty到天翼云,SSH隧道管理内部服务(putty,ssh secure shell)for win
  13. paip.c++ qt 图片处理 检测损坏的图片
  14. 如何把Word的默认页面颜色由白色改为绿色
  15. HP246 G6 笔记本升级
  16. nacos2.0服务提示注册成功,但是服务管理列表中没有注册到
  17. (转载)JavaScript:双波浪号“~~“ 与 Math.floor()
  18. python生僻字如何转码_装13失败后,我决定使用Python为生僻字批量注音
  19. feed流和瀑布流_推荐系统之Feed流UI交互设计
  20. 华为鸿蒙手机用大卡还是小卡,教你解决SIM卡剪卡导致华为P8手机不识卡的问题...

热门文章

  1. mybatis 知识1
  2. Java学习小程序(2)输出三个数中的最大值
  3. spark之5:配置文件
  4. TextView之二:常用属性
  5. Machine Learning on Spark——统计基础(二)
  6. Scrapy定向爬虫教程(一)——创建运行项目和基本介绍
  7. spark.mllib:Optimizer
  8. 【从传统方法到深度学习】图像分类
  9. 【MySQL经典案例分析】关于数据行溢出由浅至深的探讨
  10. 利用js实现 禁用浏览器后退| 去除上一个历史记录链接