C#中equal与==的区别

来源 https://www.cnblogs.com/dearbeans/p/5351695.html

C#中,判断相等有两种方式,一种是传统的==操作,一种是object提供的Equals方法。二者的区别在于:

一、==操作符判断的是堆栈中的值,Equlas判断的是堆中的值。

C#提供值类型和引用类型,值类型存储在栈上,故用==判断是直接判断其值是否相等,因为值类型不存在堆中的数据,因此值类型的Equals也是判断数据。即,对于值类型而言,==与Equals相同,均是判断其值是否相等。

对于引用类型而言,其栈中存储的是对象的地址,那么==就是比较两个地址是否相等,即是否指向同一个对象;Equals函数则是比较两个对象在堆中的数据是否一样,即两个引用类型是否是对同一个对象的引用。

二、String类型特殊

String类型虽然是引用类型,但是对String对象的赋值却按照值类型操作。

例如:

  1. String s1="hello";
  2. String s2="hello";

对s2初始化的时候,并没有重新开辟内存,而是直接将其地址指向s1的内容“hello”。这样一来,string类型虽然是引用类型,但是其==操作和Equals操作都是一样的,均比较值是否相等。

三、与GetHashCode()的关系

若两对象Equals相等,那么其GetHashCode()必定相等;但是反过来,若GetHashCode()相等,那么这两个对象Equals方法比较结果不一定相同。(为了获取最佳性能,hash函数为对象内容生成的数字是随机分布的,这就意味着,内容不同的对象,有可能生成的数字是一样的,但可以认为这种概率非常小)。

下面示例说明:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace ConsoleApplication1
  7. {
  8. class People
  9. {
  10. private string name;
  11.  
  12. public string Name
  13. {
  14. get { return name; }
  15. set { name = value; }
  16. }
  17.  
  18. public People(string name)
  19. {
  20. this.name = name;
  21. }
  22. }
  23.  
  24. class Program
  25. {
  26. static void Main(string[] args)
  27. {
  28. string a = "hello";
  29. string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
  30. Console.WriteLine(a == b);
  31. Console.WriteLine(a.Equals(b));
  32. Console.WriteLine("\n");
  33.  
  34. Int32 m = 3;
  35. Int32 n = 3;
  36. Console.WriteLine(n == m);
  37. Console.WriteLine(n.Equals(m));
  38. Console.WriteLine("\n");
  39.  
  40. object g = a;
  41. object h = b;
  42. Console.WriteLine(g == h);
  43. Console.WriteLine(g.Equals(h));
  44. Console.WriteLine(g.GetHashCode() + " " + h.GetHashCode());
  45. Console.WriteLine("\n");
  46.  
  47. People p1 = new People("Jimmy");
  48. People p2 = new People("Jimmy");
  49. Console.WriteLine(p1 == p2);
  50. Console.WriteLine(p1.Equals(p2));
  51. Console.WriteLine(p1.GetHashCode() + " " + p2.GetHashCode());
  52. Console.WriteLine("\n");
  53.  
  54. People p3 = new People("Jimmy");
  55. People p4 = p3;
  56. Console.WriteLine(p3 == p4);
  57. Console.WriteLine(p3.Equals(p4));
  58.  
  59. }
  60. }
  61. }

运行结果如下:

  1. 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;如果内存地址不相同,则继续判断值是否相同。

下面示例说明:

  1. static void Main(string[] args)
  2. {
  3. string a = new string(new char[] { 'c', h', e',n', '1' });
  4. string b = new string(new char[] { 'c', h', e',n', '1' });
  5. Console.WriteLine(a == b); //结果为true
  6. Console.WriteLine(a.Equals(b));//结果为true
  7.  
  8. object g = a;
  9. object h = b;
  10. Console.WriteLine(g == h);//结果为false
  11. Console.WriteLine(g.Equals(h));//结果为true
  12.  
  13. Person p1 = new Person("csw");
  14. Person p2 = new Person("csw");
  15. Console.WriteLine(p1 == p2);//结果为false
  16. Console.WriteLine(p1.Equals(p2));//结果为false
  17.  
  18. Person p3 = new Person("csw");
  19. Person p4 = p3;
  20. Console.WriteLine(p3 == p4);//结果为true
  21. Console.WriteLine(p3.Equals(p4));//结果为true
  22.  
  23. Console.ReadLine();
  24. }

========== End

C#中equal与==的区别的更多相关文章

  1. 【转】java中equal与==的区别 其中有个缓冲区,需要注意

    转自http://www.cnblogs.com/dolphin0520/p/3592500.html 在学Java时,可能会经常碰到下面的代码: 1 String str1 = new String ...

  2. 关于Java中equal 和 == 的区别

    在对Java开发还不熟练的时候,往往很多人都喜欢用==去比较两个对象是否相等,有时候就会出现很奇葩的问题. 其实这类问题并不是奇葩问题,只是我们不够细心而已,在Java中“==”比较两个变量本身的值, ...

  3. Java中equal和==区别及String创建过程

    Java中equal和==区别 1.起因 在一段Java代码中,使用了两种实现方式. //第一种命令行输入 int main (String[] args) { if(args[0] == " ...

  4. .equal()和==的区别

    1.首先,equal和==最根本的区别在于equal是一个方法,而==是一个运算符. 2.一般来说,==运算符比较的是在内存中的物理地址,.equal()比较的是哈希算法值是否相等(即hashcode ...

  5. 正则匹配中 ^ $ 和 \b 的区别

    正则匹配中 ^ $ 和 \b 的区别     ^和$分别代表字符串的开始和结束,因此^\d$只能匹配包含一个数字的字符串\b代表单词边界,其前后必须是不同类型的字符,可以组成单词的字符为一种类型,不可 ...

  6. java中ArrayList 、LinkList区别

    转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...

  7. 数据库中MyISAM与InnoDB区别

    数据库中MyISAM与InnoDB区别 首页 » DIY技术区 » 数据库中MyISAM与InnoDB区别 09:57:40   MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是I ...

  8. socket网络编程中read与recv区别

    socket网络编程中read与recv区别 1.read 与 recv 区别 read 原则: 数据在不超过指定的长度的时候有多少读多少,没有数据则会一直等待.所以一般情况下:我们读取数据都需要采用 ...

  9. 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

    详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别 http://blog.sina.com.cn/s/blog_686999de0100jgda.html   实例: ...

随机推荐

  1. VS2012添加数据库连接时报错,未能加载文件或程序集microsoft.sqlserver.management.sdk.sfc

    今天在VS2012中添加数据库连接时报错 未能加载文件或程序集microsoft.sqlserver.management.sdk.sfc,Version=11.0 查了很多资料,最后下载安装了Sha ...

  2. JQuery 的Ajax的使用

    JSON:一种轻量级的数据表示方法,优点:传输方便,占用字节少 XML:一种偏重量级的数据表示方法,优点:格式清晰,占用字节多,大量的字节都浪费在了标签上: 网络传输我们常使用json,因为浏览器解析 ...

  3. SDK安装详解以及adb的来源

    首先,下载Android SDK Tools,翻过墙的朋友可以去Google Android的官网上下载(http://developer.android.com/sdk/index.html) 选择 ...

  4. CodeIgniter框架对数据库查询结果进行统计

    假设有一个user表,如果要查询符合条件sex=male的记录数量,有下面几种方法: 方法一:先取回所有符合条件的记录,再count $res = $this->db->query(&qu ...

  5. Tomcat web.xml配置参数详解

    Apache Tomcat Configuration Reference - The Context Containerhttps://tomcat.apache.org/tomcat-5.5-do ...

  6. PHP中stdClass的意义

    在WordPress中很多地方使用stdClass来定义一个对象(而通常是用数组的方式),然后使用get_object_vars来把定义的对象『转换』成数组. 如下代码所示:   1 2 3 4 5 ...

  7. CPU Cache 机制以及 Cache miss

    CPU体系结构之cache小结 1.What is cache? Cache是用来对内存数据的缓存. CPU要访问的数据在Cache中有缓存,称为“命中” (Hit),反之则称为“缺失” (Miss) ...

  8. StringTokenizer

    StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数. 1.构造函数 public StringTokenizer(String str) public Str ...

  9. /dev被异常删除的问题

    今天遇到一个问题,在执行某些操作后,发现经常报“read_urandom: /dev/urandom: open failed: No such file or directory”这个错误.后来查看 ...

  10. 不使用DataContext直接将ViewModels绑定到ItemsControl控件

    在常规的MVVM设计模式中,都是通过DataContext将ViewModels的一个对象绑定到View的DataContext中,从而完成相应地绑定,在本文中我们将通过另外的一种思路来将ViewMo ...