C#中equal与==的区别
来源:互联网 发布:java web多用户量优化 编辑:程序博客网 时间:2024/05/17 00:15
转 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(); }
- C#中equal与==的区别
- C#中equal与==的区别
- C# 中==和Equal的区别
- C#中Equal与==的使用原则
- java中 == 与 equal 的区别
- java中 == 与 equal 的区别
- Java中==与equal的区别
- java中 == 与 equal 的区别
- java中 == 与 equal 的区别
- java 中“==”与“equal” 的区别
- Java中“==” 与 “equal”的区别
- java中equal与==的区别
- java中==与equal()方法的区别
- java 中“==”与“equal” 的区别
- java中 == 与 equal 的区别
- java中equal()与==的区别简记
- java中==与equal的区别
- java中==与equal()方法的区别
- Linux环境安装maven
- CentOS mysql 显示Can't connect to local MySQL server through socket
- 不要使用IDE内嵌的maven
- linorder
- 阿里巴巴Java开发手册学习小结6-控制语句
- C#中equal与==的区别
- Spring快速入门
- 【分块】HihoCoder1629+BZOJ4537
- jq svg 修改image的xmlns:xlink及图片的显隐
- 有没有会使用Imlab源码的
- scrapy命令行详解
- C语言:_I 的解析
- 双线性插值理论与代码实例
- Java中对象的创建、内存分配和销毁