C#中equal与==的区别
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    4610472812289376    True    True      请按任意键继续. . .
在C#中,string 类型的特点有:
(1)属于基本数据类型;
(2)是引⽤类型;
(3)只读;
(4) string a="1123";
string b="1123";
那么a和b指向同⼀个内存地址;
但是并⾮2个相同值相等的字符串就对应同⼀个内存地址;writeline函数
(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();
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。