四种C#对象的比较方式
|
admin
2025年4月28日 13:3
本文热度 74
|
在C#中比较两个对象是否相等,通常有四种主要方式
1、ReferenceEquals(object o1, object o2):
Person zs = new Person("ZhangSan",28);
Person ls = new Person("LiSi",20);
Person zsCopy = zs;
//ReferenceEquals比较两个对象的引用,同为null是返回true
Console.WriteLine("ReferenceEquals(zs, ls) : " + ReferenceEquals(zs, ls)); // False
Console.WriteLine("ReferenceEquals(zs, zsCopy) : " + ReferenceEquals(zs, zsCopy)); //True
Console.WriteLine("ReferenceEquals(ls, zsCopy) : " + ReferenceEquals(ls, zsCopy)); //Fasle
Console.WriteLine("ReferenceEquals(null, null) : " + ReferenceEquals(null, null)); //True
Console.WriteLine("ReferenceEquals(zs, null) : " + ReferenceEquals(zs, null)); //False
Console.WriteLine("ReferenceEquals(1, 1) : " + ReferenceEquals(1, 1)); //False
2、Equals(object o):
Person zs = new Person("ZhangSan",28);
Person ls = new Person("LiSi",20);
Person zsCopy = zs;
//虚拟Equals方法,比较引用,可以重写比较值
Console.WriteLine("zs.Equals(ls) : " + zs.Equals(ls)); //Fasle
Console.WriteLine("zs.Equals(zsCopy) : " + zs.Equals(zsCopy)); //True
Console.WriteLine("ls.Equals(zsCopy) : " + ls.Equals(zsCopy)); //False
Console.WriteLine("zs.Equals(null) : " + zs.Equals(null)); //False
Console.WriteLine("1.Equals(1) : " + 1.Equals(1)); //True
3、Equals(object o1, object o2)
Person zs = new Person("ZhangSan",28);
Person ls = new Person("LiSi",20);
Person zsCopy = zs;
//静态Equals方法先比较两个对象是否为空,如果都不为空,则调用虚拟Equals方法
Console.WriteLine("Person.Equals(zs, ls) : " + Person.Equals(zs, ls)); //False
Console.WriteLine("Person.Equals(zs, zsCopy) : " + Person.Equals(zs, zsCopy)); //True
Console.WriteLine("Person.Equals(ls, zsCopy) : " + Person.Equals(ls, zsCopy)); //False
Console.WriteLine("Person.Equals(null, null) : " + Person.Equals(null, null)); //True
Console.WriteLine("Person.Equals(zs, null) : " + Person.Equals(zs, null)); //Fasle
Console.WriteLine("Person.Equals(1, 1) : " + Person.Equals(1, 1)); //True
4、object1 == object2:
比较运算符:可以重写;对于引用类型,默认是比较引用的(System.String除外)来源,对于值类型默认比较值;
对于自定义的结构,如果不显示重载operator方法,则无法使用。
由于在C#中要求比较运算符必须成对重载,重载==运算符的同时也必须重载!=运算符,否则也会产生编译错误。
如果要重载的话,运算符"=="、"!=" 与 Equals方法、GetHashCode方法应该同时被重载,因为他们应该保持同样的相等逻辑。但不要再==中调用Equals,最好是在Equals中调用==。
Person zs = new Person("ZhangSan",28);
Person ls = new Person("LiSi",20);
Person zsCopy = zs;
String str1 = "Hello";
String str2 = "Hello";
String str3 = str1;
//比较运算符比较引用,可以重写
Console.WriteLine("zs == ls : " + (zs == ls)); //False
Console.WriteLine("zs == zsCopy : " + (zs == zsCopy)); //True
Console.WriteLine("ls == zsCopy : " + (ls == zsCopy)); //False
Console.WriteLine("zs == null : " + (zs == null)); //False
Console.WriteLine("1 == 1 : " + (1 == 1)); //True
Console.WriteLine("str1 == str2 :" + (str1 == str2));//True
Console.WriteLine("str1 == str3 :" + (str1 == str3));//True
Console.WriteLine("str2 == str3 :" + (str2 == str3));//True
Equals(object o)与==的区别
1) ==操作符判断的是堆栈中的值,Equlas判断的是堆中的值。
2) C#提供值类型和引用类型:
3) String类型特殊:
4) 与GetHashCode()的关系
出处:cnblogs.com/LXLR/archive/2023/07/16/17558349.html
作者:LXLR
该文章在 2025/4/28 13:07:45 编辑过