加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#中==与Equals的区别

发布时间:2020-12-16 01:19:30 所属栏目:百科 来源:网络整理
导读:转:https://blog.csdn.net/hujiao199/article/details/4027286 using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { ??? class Person ??? { ??????? private string name; ??????? public string Name ?

转:https://blog.csdn.net/hujiao199/article/details/4027286

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
??? class Person
??? {
??????? private string name;

??????? public string Name
??????? {
??????????? get { return name; }
??????????? set { name = value; }
??????? }

??????? public Person(string name)
??????? {
??????????? this.name = name;
??????? }
??? }


??? class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? string a = new string(new char[] { ‘h‘,‘e‘,‘l‘,‘o‘ });
??????????? string b = new string(new char[] { ‘h‘,‘o‘ });
??????????? Console.WriteLine(a == b);
??????????? Console.WriteLine(a.Equals(b));

??????????? object g = a;
??????????? object h = b;
??????????? Console.WriteLine(g == h);
??????????? Console.WriteLine(g.Equals(h));

??????????? Person p1 = new Person("jia");
??????????? Person p2 = new Person("jia");
??????????? Console.WriteLine(p1 == p2);
??????????? Console.WriteLine(p1.Equals(p2));


??????????? Person p3 = new Person("jia");
??????????? Person p4 = p3;
??????????? Console.WriteLine(p3 == p4);
??????????? Console.WriteLine(p3.Equals(p4));

??????????? Console.ReadLine();
??????? }
??? }
}

答案为何为true true false true? false false true true

因为值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。? "==" : 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。? "equals" : 操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。??? 而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。??? 因此在上面的例子中,第一对输出,字符串a和字符串b的两个比较是相等的。??? 对于 第二对输出 object g = a 和object h = b,? 在内存中两个不同的对象,所以在栈中的内容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。如果将字符串a和b作这样的修改:??????? string a="aa";??????? string b="aa";则,g和h的两个比较都是相等的。这是因为系统并没有给字符串b分配内存,只是将"aa"指向了b。所以a和b指向的是同一个字符串(字符串在这种赋值的情况下做了内存的优化)。对于p1和p2,也是内存中两个不同的对象,所以在内存中的地址肯定不相同,故p1==p2会返回false,又因为p1和p2又是对不同对象的引用,所以p1.equals(p2)将返回false。对于p3和p4,p4=p3,p3将对对象的引用赋给了p4,p3和p4是对同一个对象的引用,所以两个比较都返回true。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读