【ASP.net】Equals 和 == 的区别
在比较Equals 和 ==的区别前。我们先来了解下相关的知识
C#数据类型
1、值类型
值类型有:
值类型包括:简单类型、结构类型、枚举类型;引用类型包括:Object 类型、类类型、接口、代表元、字符串类型、数组。
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、引用类型
引用类型有:对象类型、类类型、接口、代表元、字符串类型、数组。
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; //true bool bo2 = (object)i1 == (object)i2; // 装箱后变成引用类型,引用不同 故为false bool bo3 = (i1).Equals(i2); //true 比较的是值 装箱后 Equals比较的仍是值
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 装箱后 是比较地址,这里内存中的地址是不相同的 bool b4 = ((object)str3).Equals((object)str4); //true 此时Equals依然是比较值
3、string字符串比较:== 和 Equals 同样也是比较具体的值
//string是特殊的引用类型。只要是字符串比较,不管是"=="还是"Equals"都是比较字符串的内容 string str1 = "abc"; string str2 = "abc"; bool b1 = str1 == str2; //true bool 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); //true bool b5 = str1 == str3; //true bool b6 = (str1).Equals(str3); //true object str5 = "abc"; //定义一个变量 str5并赋值为 abc object str6 = "abc"; //定义一个变量 str6并指向字符串abc bool b7 = str5 == str6; //true bool b8 = (object)str5 == (object)str6; //但这样就是比较引用是否相同,因为str5 和 str6 引用同一个实例 即为 true bool 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字符串比较)所有比较是不是对同一个对象的引用,这里显然是内存中两个不同的引用对象。故为false bool b11 = str7.Equals(str8); //同上 MyClass str9 = str7; //str7的地址赋值给str9。 bool bl2 = str7 == str9; //true 引用同一个对象 bool bl3 = str7.Equals(str9); //true object str10 = new object(); object str11 = new object(); bool b12 = str10 == str11; //false bool 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); //true bool an = str7.Equals(str18); //false
最后谈谈这两个有什么区别:
string str1 = "abc"; string str3 = new string(new char[] { 'a', 'b', 'c' });
以上这两句话大家应该都见得多,比如str3这句笔试题居多,大体都是创建了几个string对象。回答理所当然是两个。一个是存放在堆内存上数据"abc",一个是存在栈内存上对"abc"的引用,通俗一点就是栈上的引用地址指向堆中的值或内容。
来看看str1这句,这并没有创建对象。即没有在内存中分配空间。因为没有使用new运算符,这里仅仅是声明了一个指向对象的引用变量str1,暂时指向"abc",所有这里只创建了一个string对象,所有要区分new的方式
看看下面这个列子是创建了3个对象。因为字符串是不可变的
string x = "ab"; string y = "a"; string x = x + y;
不知道C#中有没有常量池这一概念。还有看到网上很多这样的 string str = new string("abc") 可我真的没找到stirng的这个重载函数
---------Equals 和 == 的区别末前就了解这么多。知识比较基础,阅历还不够。刚出来混的。不足之处还请多多指教,文明发言。共同学习。谢谢!
【ASP.net】Equals 和 == 的区别的更多相关文章
- java equals和==的区别
大概说equals和==都比较的是什么: 1. boolean tem = a == b; 首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容.因为栈是用来存放地址或是java中 ...
- equals与==的区别
equals与==的区别. 下面是equals的源码 public boolean equals(Object anObject) { if (this == anObject) { //如果两个对象 ...
- equals和==的区别 你真的掌握了吗?
PS:最近读Java编程思想的时候发现了一些小问题.就是equals方法和==,感觉自己是真正掌握了,其实并没有.简单的记录一下. 学习内容: 1.equals 和 == 的区别 equals和== ...
- 【java】由equals和==的区别引出的常量池知识
equals和==的区别,百度查到的结果大都是:equals比较的是值,==比较的是引用地址. String str1 = "abc"; String str2 = "a ...
- 比较compareTo与equals及==的区别
1.compareTo: 附上:源码: public int compareTo(String anotherString) { int len1 = value.length; ...
- Java笔记——equals和==的区别
摔在这里几次,还是记下来吧. 原文:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html -------------- ...
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
- equals()和hashCode()区别?
equals()和hashCode()区别? ------------------------------------------------- equals():反映的是对象或变量具体的值,即两个对 ...
- 【转】Java中equals和==的区别
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
随机推荐
- zabbix3.0.4 部署之一 (简介)
官方网站:http://www.zabbix.com/ 下载地址:http://www.zabbix.com/download.php zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视 ...
- javaWeb4 http
状态码:服务器处理请求的结果(状态) 常见的状态: 200: 表示请求处理完成并完美返回.ok 302:表示请求需要进一步细化. 404:表示客户访问的资源找不到.Not Found 500:表示服务 ...
- python爬虫(1)
了解python的基本语法后就可以开始了,边学边巩固. 学爬虫那什么是网络爬虫,以下是百度百科的定义:网络爬虫(又被称为网页蜘蛛,网络机器人, 在FOAF社区中间,更经常的称为网页追逐者),是一种按照 ...
- NET中的规范标准注释(一) -- XML注释标签讲解
一.摘要 .Net允许开发人员在源代码中插入XML注释,这在多人协作开发的时候显得特别有用. C#解析器可以把代码文件中的这些XML标记提取出来,并作进一步的处理为外部文档. 这篇文章将展示如何使用这 ...
- [转载]javaEE规范和SSH三大框架到底有什么关系
转载自: http://blog.csdn.net/bingjing12345/article/details/20641891 1994-2000 年是互联网的大航海时代. 请注意,下面的时间点及其 ...
- hadoop运行原理之shuffle
hadoop的核心思想是MapReduce,但shuffle又是MapReduce的核心.shuffle的主要工作是从Map结束到Reduce开始之间的过程.首先看下这张图,就能了解shuffle所处 ...
- CentOS6.4安装Hadoop2.0.5 alpha - Single Node Cluster
1.安装JDK7 rpm到/usr/java/jdk1.7.0_40,并建立软链接/usr/java/default到/usr/java/jdk1.7.0_40 [root@server-308 ~] ...
- 常用的工具cmd命令
1.stikynot 2.psr 3.cmd 4.calc 5.mspaint 6.ping
- ubuntu下内核源码树的建立
参考的博文: http://www.360doc.com/content/12/0604/12/8890849_215794364.shtml http://www.cnblogs.com/pd520 ...
- Introducing Windows 10 Editions(Windows10版本介绍)
Windows 10将在今年夏天正式发布,今天微软官方博客分享了一些Windows 10版本的细节.详见Introducing Windows 10 Editions Windows 10 HomeW ...