1.对于值类型
如果对象的值相等,则相等运算符==返回True,否则返回False
2.对于引用类型
equals方法比较的是两个对象指向的内存空间内容是不是相同。也就是比较两个引用类型是否是对同一个对象的引用,即两个对象的内容是否相等。
对于string类型,==比较字符串的值
对于引用类型,==操作符类似于比较的是文件夹的路径是否相同,而equals方法比较的是文件夹中的内容是不是一样。
using System;namespace Equals和等号的区别{ class ClassPerson { private string name=null; public ClassPerson(string strname) { name = strname; } public string Name { set { name = value; } get { return name; } } } class Program { static void Main(string[] args) { string s1 = "test"; string s2 = "test"; Console.WriteLine(s1 == s2); //True Console.WriteLine(s1.Equals(s2)); //True object o1 = s1; object o2 = s2; Console.WriteLine(o1 == o2);//True Console.WriteLine(o1.Equals(o2));//True string s3 = new string(new char[] { 't', 'e', 's', 't' }); string s4 = new string(new char[] { 't', 'e', 's', 't' }); Console.WriteLine(s3 == s4);//True Console.WriteLine(s3.Equals(s4));//True object o3 = s3; object o4 = s4; Console.WriteLine(o3 == o4);//False Console.WriteLine(o3.Equals(o4));//True ClassPerson p1 = new ClassPerson("ltp"); ClassPerson p2 = new ClassPerson("ltp"); Console.WriteLine(p1 == p2);//False Console.WriteLine(p1.Equals(p2));//False ClassPerson p3 = new ClassPerson("ltp"); ClassPerson p4 = p3; Console.WriteLine(p3 == p4);//True Console.WriteLine(p3.Equals(p4));//True } }}因为值类型是存储在内存中的堆栈(以下简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的是两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
堆和栈的区别是?
1、栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) ― 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
堆和栈的区别可以用如下的比喻来看出: 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。