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

53 篇文章 1 订阅

(一):比较对象的方法

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

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

欢迎访问小程序:

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值