C#基础 - equals和==的区别
2021-07-03 10:12
标签:不同的 ring str als 存储 方法 比较 处理 == 1、对于值类型来说,==和equals都是比较栈中的变量的值是否相等。 int i = 10; int j = 10; i == j; // true i.equals(j); //true 2、对于引用类型来说(排除string类型),==比较的是栈中的两个变量的值是否相同,但因为栈中保存的是变量指向的堆中对象的首地址,所以也可以说比较的是两者是否指向堆中的同一个对象;equals比较的也是两个变量是否指向同一个对象。 Object a = new Object("ddd"); Object b = new Object("ddd"); a == b; //false a.equals(b); //false a和b指向的并不是同一个对象,所以不会相等。 Object c = new Object("ddd"); Object d = c; c == d; //true d.equals(d); //true 把c的引用赋值给d,使得c和d都指向同一个对象,所以会相等。 3、对于string类型的引用变量来说,因为C#中string对象的很多方法包括equals方法都被重载了,所以使得string类型的==和equals用起来跟值类型差不多。但因为堆中有静态存储区和动态存储区,以下情况还是要区分的。 第一种情况,如果只是单纯的给string赋值,而不动态new出一个空间,跟值类型处理一样,只比较堆中的值是否相等。如: string a = "ddd"; string b = "ddd"; a == b; //true a.equals(b); //true string类型的比较只会比较他们的值 Object c = a; Object d = b; c == d; // true c.equals(d); //true a和b的值会被保存在静态存储区,所以把a和b赋值给c和d,c和d指向的是同一块静态存储区,所以都为true 第二种情况,string类型的2个变量在堆中new出两个对象,如: string a = new string("ddd"); string b = new string("ddd"); a == b; //true a.equals(b); //true string类型的比较只会比较他们的值 Object c = a; Object d = b; c == d; //false c.equals(d); //true 把a和b赋值给c和d,就是把两者的引用赋值给c和d两个对象,所以c和d指向的是不同的对象,a == b是false的,那为什么c.equals(b)会是true呢,因为此时的equals这个方法用的还是string的equals方法,所以只会去比较他堆中的值是否相等。 C#基础 - equals和==的区别 标签:不同的 ring str als 存储 方法 比较 处理 == 原文地址:https://www.cnblogs.com/zfylzl/p/9895361.html
文章标题:C#基础 - equals和==的区别
文章链接:http://soscw.com/index.php/essay/101213.html