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 实例: ...
随机推荐
- VS2012添加数据库连接时报错,未能加载文件或程序集microsoft.sqlserver.management.sdk.sfc
今天在VS2012中添加数据库连接时报错 未能加载文件或程序集microsoft.sqlserver.management.sdk.sfc,Version=11.0 查了很多资料,最后下载安装了Sha ...
- JQuery 的Ajax的使用
JSON:一种轻量级的数据表示方法,优点:传输方便,占用字节少 XML:一种偏重量级的数据表示方法,优点:格式清晰,占用字节多,大量的字节都浪费在了标签上: 网络传输我们常使用json,因为浏览器解析 ...
- SDK安装详解以及adb的来源
首先,下载Android SDK Tools,翻过墙的朋友可以去Google Android的官网上下载(http://developer.android.com/sdk/index.html) 选择 ...
- CodeIgniter框架对数据库查询结果进行统计
假设有一个user表,如果要查询符合条件sex=male的记录数量,有下面几种方法: 方法一:先取回所有符合条件的记录,再count $res = $this->db->query(&qu ...
- Tomcat web.xml配置参数详解
Apache Tomcat Configuration Reference - The Context Containerhttps://tomcat.apache.org/tomcat-5.5-do ...
- PHP中stdClass的意义
在WordPress中很多地方使用stdClass来定义一个对象(而通常是用数组的方式),然后使用get_object_vars来把定义的对象『转换』成数组. 如下代码所示: 1 2 3 4 5 ...
- CPU Cache 机制以及 Cache miss
CPU体系结构之cache小结 1.What is cache? Cache是用来对内存数据的缓存. CPU要访问的数据在Cache中有缓存,称为“命中” (Hit),反之则称为“缺失” (Miss) ...
- StringTokenizer
StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数. 1.构造函数 public StringTokenizer(String str) public Str ...
- /dev被异常删除的问题
今天遇到一个问题,在执行某些操作后,发现经常报“read_urandom: /dev/urandom: open failed: No such file or directory”这个错误.后来查看 ...
- 不使用DataContext直接将ViewModels绑定到ItemsControl控件
在常规的MVVM设计模式中,都是通过DataContext将ViewModels的一个对象绑定到View的DataContext中,从而完成相应地绑定,在本文中我们将通过另外的一种思路来将ViewMo ...