c# equals与==的区别【转】
==操作比较的是两个变量的值是否相等。
equals()方法比较的是两个对象的内容是否一致.equals也就是比较引用类型是否是对同一个对象的引用。
对于值类型的比较,这里就不做描述了,下面讨论引用类型的比较:
首先我们看一段程序
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;
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
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。
为什么会出现这个答案呢?因为值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。
因此在上面的例子中,字符串a和字符串b的两个比较是相等的。
对于object g 和object h 时内存中两个不同的对象,所以在栈中的内容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。如果将字符串a和b作这样的修改:
string a="aa";
string b="aa";
则,g和h的两个比较都是相等的。这是因为系统并没有给字符串b分配内存,只是将"aa"指向了b。所以a和b指向的是同一个字符串(字符串在这种赋值的情况下做了内存的优化)。
对于p1和p2,也是内存中两个不同的对象,所以在内存中的地址肯定不相同,故p1==p2会返回false,又因为p1和p2又是对不同对象的引用,所以p1.equals(p2)将返回false。
对于p3和p4,p4=p3,p3将对对象的引用赋给了p4,p3和p4是对同一个对象的引用,所以两个比较都返回true。
如果我们对person的equals方法重写:
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;
}
public override bool Equals(object obj)
{
if (!(obj is Person))
return false;
Person per = (Person)obj;
return this.Name == per.Name;
}
}
}
那么p1.equals(p2),就会返回true。
转载:http://www.cnblogs.com/jiahaipeng/archive/2008/04/11/1146316.html
补充:
名称 | 说明 |
---|---|
Object.Equals (Object) |
确定指定的 Object 是否等于当前的 Object。
由 .NET Compact Framework 支持。 |
Object.Equals (Object, Object) |
确定指定的 Object 实例是否被视为相等。
由 .NET Compact Framework 支持。 |
转载于:https://www.cnblogs.com/lgxjt168/archive/2008/08/25/1276077.html
c# equals与==的区别【转】相关推荐
- 【Java常识】6.0面向对象认知和Eclipse的实用使用、==号和equals方法的区别
1.曾经写过很多自以为很通俗易懂的面向对象的解释. 如下是目前最通俗的一种解释: 2.Eclipse的补充解释. 运行的快捷键:F11. 3.Eclipse快捷键大全 大全放本文最后,这里主要放常用的 ...
- JAVA 中equals()与==的区别
原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...
- c# equals与==的区别
c# equals与==的区别 对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 ...
- 面试官:谈谈equals() 和 == 的区别
引言 谈谈equals() 和 == 的区别,这是一个非常经典的问题,不是特别难,面试也时有问道:但是很多小伙伴在面试时脑子却一片空白,痛失offer:所以在这里我详细介绍一下这两者的区别,希望对你能 ...
- Java基础 抽象类和接口的区别、equals 与 == 的区别
一.抽象类和接口有什么区别 抽象类与接口都用于抽象,但是抽象类可以有自己的部分实现,而接口规范某一行为,调用者实现这个接口. 主要区别: 1.抽象类还是类只能单继承,而接口却可以多实现. 2.抽象类满 ...
- 浅谈equals和==的区别
基本数据类型 八大基本数据类型:Byte,short,int,long,double,folat,boolean,char 引用数据类型 四大基本数据类型:String,数组类型 [ ] ,class ...
- Java基础之equals和==的区别深入解析
Java基础之equals和==的区别深入解析 以下是本文目录大纲 equals 和 == 的区别 equals 的重写 复写hashCode方法,有31这个数字的作用 1. equals 和 == ...
- Equals 和 == 的区别
在比较Equals 和 ==的区别前.我们先来了解下相关的知识 C#数据类型 1.值类型 值类型有: 值类型包括:简单类型.结构类型.枚举类型. byte(1).sbyte(1).short(2).u ...
- equals()与==的区别
"=="比较两个变量本身的值,即两个对象在内存中的首地址. "equals()"比较字符串中所包含的内容是否相同. 比如: String s1,s2,s3 = ...
- 处理对象(toString()方法详解和==与equals方法的区别)
处理对象(toString()方法详解和==与equals方法的区别) toString()是一个非常特殊的方法,它是一个自我描述的方法.当程序员直接打印该对象的时候,系统会输出该对象的"自 ...
最新文章
- 法国呼叫服务公司Aircall获得800万美元融资
- 从0到1写RT-Thread内核——临界段的保护
- tinkerpop mysql_图论数据库未来的发展方向?
- C语言标准库<math.h>
- react 生成图片二维码_21个React开发神器
- Sublime Text 无法安装插件
- 利用WebUtil删除Cookies
- IDEA快速升级模块版本号
- Python单元测试框架之pytest -- fixtures
- IsPostBack
- 矩阵理论的一些基本概念
- btsync同步文件+linux,利用BTSync 实时同步文件
- Advanced Auto Layout
- Android 用代码获取基站号(cell)和小区号(lac)
- firefox被hao.360劫持的处理方法
- 一文了解无聊猿(BAYC)的 NFT 帝国是如何形成的
- deepin连接投影仪显示不完全
- 【转载】不用加号和减号计算两个数的加法
- 高等数学(第七版)同济大学 习题11-2 个人解答
- win7桌面图标全变成windows media center 解决办法
热门文章
- mysql忘记密码可以卸载吗_mysql忘记密码,修改密码重新安装的一些问题
- 【IM】关于半监督学习的理解
- Oracle\Sqlserver\Mysql\Sybase\DB2五类数据库通信协议
- 关于mysql数据库中存放中文字段乱码问题解决方案
- mine 规范_《民用建筑热工设计规范》GB50176-2016
- linux mysql卸载_Linux环境搭建
- Get Started with Apex的playground练习
- 判断一个整数是否是水仙花数 || 编写程序,根据输入的月份和年份,求出该月的天数(1-12)|| 运算符的优先级问题 ||输出小写的a-z以及大写的Z—A||求出1-1/2+1/3-1/4…..1/
- Response对象学习
- 数据库知识点2——关系模型之基本概念