栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

C#(二十五)之C#对象比较

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#(二十五)之C#对象比较

(一):比较对象的方法

概念有点多,看看就行了:

1:ReferenceEquals:

Object.ReferenceEquals(left, right)静态方法:从名称中便可知它用来比较两者是否是相同的引用,我们也永远不应该去重写该方法。它对于值类型对象的比较永远返回false;对于两个null的比较永远返回true。此方法必须使用类来调用。

cat f1 = new cat(5);
cat f2 = new cat(5);
// ReferenceEquals
Console.WriteLine("ReferenceEquals:"+cat.ReferenceEquals(f1,f2));

2:实例Equals

Equals()虚拟版本的System.Object实现代码也比较引用。但因为这个方法是虚拟的(虚方法),所以可以在自己的类中重写它,按值来比较对象。特别是如果希望类的实例用作字典中的键,就需要重写这个方法,以比较值。否则,根据重写Object.GetHashCode()的方式,包含对象的字典类要么不工作,要么工作的效率非常低。在重写Equals()方法时要注意,重写的代码不会抛出异常。

重写Equals应该遵循的原则:自反性、对称性、传递性。即:a=a;若a=b,则b=a;若a=b,b=c,则a=c;另外两个对象要么相等要不不等,所以该方法不应该抛出异常。

cat f1 = new cat(5);
cat f2 = new cat(5);
// object.Equals
Console.WriteLine("Equals:" + cat.Equals(f1, f2));

3:静态Equals

Object.Equals(left, right)静态方法:该方法也永远不需要重写,因为它最终会把判断权交给参数left的实例Equls方法,因此没有必要重写该方法,只需要保证实例Equals返回想要的结果即可。

cat f1 = new cat(5);
cat f2 = new cat(5);
// Equals
Console.WriteLine("Equals:" + f1.Equals(f2));

4:相等运算符==

比较运算符==:对于引用类型,默认是比较引用的(System.String除外)来源,对于值类型默认比较值,对于自定义的结构,如果不显示重载operator 方法,则无法使用

由于在C#中要求比较运算符必须成对重载,重载==运算符的同时也必须重载!=运算符,否则也会产生编译错误。

如果要重载的话,运算符""、"!=" 与 Equals方法、GetHashCode方法应该同时被重载,因为他们应该保持同样的相等逻辑。但不要再中调用Equals,最好是在Equals中调用==。

cat f1 = new cat(5);
cat f2 = new cat(5);
// ==
Console.WriteLine("==:" + (f1 == f2));
 
static void Main(string[] args)
        {
            cat f1 = new cat(5);
            cat f2 = new cat(5);
            // ReferenceEquals
            Console.WriteLine("ReferenceEquals:"+cat.ReferenceEquals(f1,f2));
            // object.Equals
            Console.WriteLine("Equals:" + cat.Equals(f1, f2));
            // Equals
            Console.WriteLine("Equals:" + f1.Equals(f2));
            // ==
            Console.WriteLine("==:" + (f1 == f2));
        }

以上代码输出都是false:因为f1是一个内存栈,f2是一个内存栈。所以其二者不想等

要想使以上等式相等。

static void Main(string[] args)
        {
            cat f1 = new cat(5);
            cat f2 = f1;
            // ReferenceEquals
            Console.WriteLine("ReferenceEquals:"+cat.ReferenceEquals(f1,f2));
            // object.Equals
            Console.WriteLine("Equals:" + cat.Equals(f1, f2));
            // Equals
            Console.WriteLine("Equals:" + f1.Equals(f2));
            // ==
            Console.WriteLine("==:" + (f1 == f2));
        }

这样以上输出就都是true了。

(二):重写实例Equals方法:

在类中使用override进行重写,返回值类型是布尔类型。

// 重写之后,Equals比较的就是a的值,如果a的值相同,就是true
public override bool Equals(object obj)
{
    cat f3 = (cat)obj;
    if(f3.a == this.a)
    {
          return true;
       }else{
          return false;
       }
}

从以上的实例可以看出:重写之后Equals比较的是对象中的a的值,a相等,就是true。

而且我们也可以看出,重写实例Equals方法,静态Equals方法也会发生改变。

有好的建议,请在下方输入你的评论。

欢迎访问个人博客
https://guanchao.site

欢迎访问小程序:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1023637.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号