C#中equal与==的区别
C#中equal与==的区别
来源 https://www.cnblogs.com/dearbeans/p/5351695.html
C#中,判断相等有两种方式,一种是传统的==操作,一种是object提供的Equals方法。二者的区别在于:
一、==操作符判断的是堆栈中的值,Equlas判断的是堆中的值。
C#提供值类型和引用类型,值类型存储在栈上,故用==判断是直接判断其值是否相等,因为值类型不存在堆中的数据,因此值类型的Equals也是判断数据。即,对于值类型而言,==与Equals相同,均是判断其值是否相等。
对于引用类型而言,其栈中存储的是对象的地址,那么==就是比较两个地址是否相等,即是否指向同一个对象;Equals函数则是比较两个对象在堆中的数据是否一样,即两个引用类型是否是对同一个对象的引用。
二、String类型特殊
String类型虽然是引用类型,但是对String对象的赋值却按照值类型操作。
例如:
String s1="hello";
String s2="hello";
对s2初始化的时候,并没有重新开辟内存,而是直接将其地址指向s1的内容“hello”。这样一来,string类型虽然是引用类型,但是其==操作和Equals操作都是一样的,均比较值是否相等。
三、与GetHashCode()的关系
若两对象Equals相等,那么其GetHashCode()必定相等;但是反过来,若GetHashCode()相等,那么这两个对象Equals方法比较结果不一定相同。(为了获取最佳性能,hash函数为对象内容生成的数字是随机分布的,这就意味着,内容不同的对象,有可能生成的数字是一样的,但可以认为这种概率非常小)。
下面示例说明:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
class People
{
private string name; public string Name
{
get { return name; }
set { name = value; }
} public People(string name)
{
this.name = name;
}
} class Program
{
static void Main(string[] args)
{
string a = "hello";
string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
Console.WriteLine(a == b);
Console.WriteLine(a.Equals(b));
Console.WriteLine("\n"); Int32 m = 3;
Int32 n = 3;
Console.WriteLine(n == m);
Console.WriteLine(n.Equals(m));
Console.WriteLine("\n"); object g = a;
object h = b;
Console.WriteLine(g == h);
Console.WriteLine(g.Equals(h));
Console.WriteLine(g.GetHashCode() + " " + h.GetHashCode());
Console.WriteLine("\n"); People p1 = new People("Jimmy");
People p2 = new People("Jimmy");
Console.WriteLine(p1 == p2);
Console.WriteLine(p1.Equals(p2));
Console.WriteLine(p1.GetHashCode() + " " + p2.GetHashCode());
Console.WriteLine("\n"); People p3 = new People("Jimmy");
People p4 = p3;
Console.WriteLine(p3 == p4);
Console.WriteLine(p3.Equals(p4)); }
}
}
运行结果如下:
True True True True False True -695839 -695839 False False 46104728 12289376 True True 请按任意键继续. . .
在C#中,string 类型的特点有:
(1)属于基本数据类型;
(2)是引用类型;
(3)只读;
(4) string a="1123";
string b="1123";
那么a和b指向同一个内存地址;
但是并非2个相同值相等的字符串就对应同一个内存地址;
(5)2个string 类型做“==”操作,先判断内存地址是否相同,如果相同,则立即返回true;如果内存地址不相同,则继续判断值是否相同。
下面示例说明:
static void Main(string[] args)
{
string a = new string(new char[] { 'c', h', e',n', '1' });
string b = new string(new char[] { 'c', h', e',n', '1' });
Console.WriteLine(a == b); //结果为true
Console.WriteLine(a.Equals(b));//结果为true object g = a;
object h = b;
Console.WriteLine(g == h);//结果为false
Console.WriteLine(g.Equals(h));//结果为true Person p1 = new Person("csw");
Person p2 = new Person("csw");
Console.WriteLine(p1 == p2);//结果为false
Console.WriteLine(p1.Equals(p2));//结果为false Person p3 = new Person("csw");
Person p4 = p3;
Console.WriteLine(p3 == p4);//结果为true
Console.WriteLine(p3.Equals(p4));//结果为true Console.ReadLine();
}
========== End
C#中equal与==的区别的更多相关文章
- 【转】java中equal与==的区别 其中有个缓冲区,需要注意
转自http://www.cnblogs.com/dolphin0520/p/3592500.html 在学Java时,可能会经常碰到下面的代码: 1 String str1 = new String ...
- 关于Java中equal 和 == 的区别
在对Java开发还不熟练的时候,往往很多人都喜欢用==去比较两个对象是否相等,有时候就会出现很奇葩的问题. 其实这类问题并不是奇葩问题,只是我们不够细心而已,在Java中“==”比较两个变量本身的值, ...
- Java中equal和==区别及String创建过程
Java中equal和==区别 1.起因 在一段Java代码中,使用了两种实现方式. //第一种命令行输入 int main (String[] args) { if(args[0] == " ...
- .equal()和==的区别
1.首先,equal和==最根本的区别在于equal是一个方法,而==是一个运算符. 2.一般来说,==运算符比较的是在内存中的物理地址,.equal()比较的是哈希算法值是否相等(即hashcode ...
- 正则匹配中 ^ $ 和 \b 的区别
正则匹配中 ^ $ 和 \b 的区别 ^和$分别代表字符串的开始和结束,因此^\d$只能匹配包含一个数字的字符串\b代表单词边界,其前后必须是不同类型的字符,可以组成单词的字符为一种类型,不可 ...
- java中ArrayList 、LinkList区别
转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...
- 数据库中MyISAM与InnoDB区别
数据库中MyISAM与InnoDB区别 首页 » DIY技术区 » 数据库中MyISAM与InnoDB区别 09:57:40 MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是I ...
- socket网络编程中read与recv区别
socket网络编程中read与recv区别 1.read 与 recv 区别 read 原则: 数据在不超过指定的长度的时候有多少读多少,没有数据则会一直等待.所以一般情况下:我们读取数据都需要采用 ...
- 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别
详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别 http://blog.sina.com.cn/s/blog_686999de0100jgda.html 实例: ...
随机推荐
- tornado设置cookie并加密
最近看看tornado,遇到了sso的东西,了解下如何设置cookie 1.基本cookie set_cookie 方法在用户的浏览中设置 cookie: get_cookie 方法在用户的浏览中获取 ...
- Paypal2017实习生-软件开发-B卷
1. [编程|15分] Calculate survival fishes时间限制:1秒空间限制:32768K题目描述Given two zero-indexed arrays A and B con ...
- 使用git将项目上传到github
使用git将项目上传到github(最简单方法) 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下 ...
- BZOJ1997 平面图判定 平面图性质 2-sat
相交的两条边不能在同一侧,用2-sat即可. 平面图点数-边数关系 \(E\le 3V-6\) 写这篇文章我只是想说明,知乎一小时,题解一分钟. lb Zhihu, gos langar Qarwet ...
- 【问题解决方案】之 jmeter启动报错:Not able to find Java executable or version. Please check your Java installation
故事发生在云计算实验课上-- ** 故事发生在云计算实验课上-- Step 1 在Xshell中登录自己的cloud虚拟机后,<sudo su ->切换到root用户 Step 2 < ...
- How to Configure Email Notification in Jenkins
How to Configure Email Notification in Jenkins? - The Official 360logica Bloghttps://www.360logica.c ...
- asp.net mvc导出execl_转载
public FileResult ExportExcel() { var sbHtml = new StringBuilder(); sbHtml.Append("<table bo ...
- CentOS 7 安装配置带用户认证的squid代理服务器
这里只简述搭建一个带用户认证的普通代理 一.安装 安装过程十分简便,只需要安装一下squid,一条命令搞定 yum install squid rpm -qa | grep squid squid-- ...
- 【转帖】Linux的历史----Linux内核剖析(一)
Linux的历史----Linux内核剖析(一) 2015年04月09日 10:51:09 JeanCheng 阅读数:11351更多 所属专栏: Linux内核剖析 版权声明:本文为博主原创文 ...
- Swagger2常用注解及其说明 (转)
Api 用在Controller中,标记一个Controller作为swagger的文档资源 属性名称 说明 value Controller的注解 description 对api资源的描述 hid ...