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

简介: 本篇内容记录了比较对象的方法、重写实例Equals方法。

QQ图片20220426143928.jpg

(一):比较对象的方法


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


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方法也会发生改变。



目录
相关文章
|
7月前
|
Java C#
C# 面向对象编程解析:优势、类和对象、类成员详解
OOP代表面向对象编程。 过程式编程涉及编写执行数据操作的过程或方法,而面向对象编程涉及创建包含数据和方法的对象。 面向对象编程相对于过程式编程具有几个优势: OOP执行速度更快,更容易执行 OOP为程序提供了清晰的结构 OOP有助于保持C#代码DRY("不要重复自己"),并使代码更易于维护、修改和调试 OOP使得能够创建完全可重用的应用程序,编写更少的代码并减少开发时间 提示:"不要重复自己"(DRY)原则是有关减少代码重复的原则。应该提取出应用程序中常见的代码,并将其放置在单一位置并重复使用,而不是重复编写。
75 0
|
2月前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
124 65
|
1月前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
3月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
27 2
|
7月前
|
C#
C#的类和对象的概念学习案例刨析
【5月更文挑战第17天】C#是一种面向对象的语言,以类和对象为核心。类作为对象的模板,定义了属性(如Name, Age)和行为(如Greet)。对象是类的实例,可设置属性值。封装通过访问修饰符隐藏实现细节,如Customer类的私有name字段通过Name属性访问。继承允许新类(如Employee)从现有类(Person)继承并扩展。多态让不同对象(如Circle, Square)共享相同接口(Shape),实现抽象方法Area,提供灵活的代码设计。
68 1
|
7月前
|
C#
C#对象初始化器
C#对象初始化器
|
C#
C#——类和对象
C#——类和对象
82 0
|
7月前
|
存储 C#
C#对象和类
C#对象和类
46 0
|
7月前
|
存储 C#
C#基础语法(类和对象)
C#基础语法(类和对象)
44 2