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与==的区别的更多相关文章

  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. matplotlib 入门之Image tutorial

    文章目录 载入图像为ndarray 显示图像 调取各个维度 利用cmp 获得像素点的RGB的统计 通过clim来限定rgb 标度在下方 插值,马赛克,虚化 matplotlib教程学习笔记 impor ...

  2. PS调出怀旧雨中特写的非主流照片

    原图 最终效果 一.打开原图素材,按Ctrl + ALt + ~ 调出高光选区,按Ctrl + Shift + I 反选,然后创建曲线调整图层,适当调暗一点. 二.合并所有图层,点通道面板,选择蓝色通 ...

  3. linux中根据名称kill进程

    shell函数如下: # kill processes by name kbn() { line=`ps -a | grep $1` arr=($line) for((i=0;i<${#arr[ ...

  4. 敏捷开发、DevOps相关书籍——书单

    自己瞎整理的一些书单,都是豆瓣评分比较高的书,可以作为选择的一个参考. 书名 豆瓣链接 持续交付:发布可靠软件的系统方法 https://book.douban.com/subject/6862062 ...

  5. .net WCF WF4.5

    花了两天时间学习使用WF,把一些遇到的问题记录下来,使用的环境是VS2017,网上的资料普遍太老了 需要注意,如果使用多项目同时启动的方式需要把WCF调整到WF启动顺序之上 1.怎么使用代码活动 新建 ...

  6. Nginx三部曲(3)SSL

    我们将告诉你 Nginx 的运作模式.蕴含的概念,怎样通过调优 Nginx 来提高应用性能,或是如何设置它的启动和运行. 这个教程有三个部分: 基本概念 —— 这部分需要去了解 Nginx 的一些指令 ...

  7. oracle常用函数案例

    --INSTR函数 SELECT INSTR(' HELLO WORLD','H') FROM DUAL; --LTRIM RTRIM函数 SELECT LTRIM('*HELLO=','*') FR ...

  8. socket通信原理三次握手和四次握手详解

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP?2.         Sock ...

  9. Day 4-5 序列化 json & pickle &shelve

    序列化: 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 反序列化: 把字符转成内存里的数据类型. 用于序列化的两个模块.他 ...

  10. 在linux系统中实现各项监控的关键技术(2)--内核态与用户态进程之间的通信netlink

    Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 ...