教学-45 对象的相等

曾英-C#教学-45 对象的相等

目录

  • 四种比较对象的编程方法
  • 学会重写Equals方法
  • 理解对象的相等

1\对象的相等

  • ReferenceEquals()使用注意点:

    • 它是静态方法,需要用类来引用
    • 返回的是bool量
    • 表示的是两个引用符是否指向的是同一个对象
  • 实例Equals()方法注意点:
    • 它是虚方法,可以重写,可以重写来实现值的比较,
  • 静态Equals()方法:

  • ==:

1.1\ ReferenceEquals(f1, f2)方法实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _45_对象的相等
{
    class Program
    {
        static void Main(string[] args)
        {
            Cde f1 = new Cde(2);
            Cde f2 = new Cde(2);
            Console.WriteLine(Cde.ReferenceEquals(f1, f2));
          //由于所有的类都继承了Object类,所以这里在静态类调用的时候可以去掉"Cde."
          //Console.WriteLine(ReferenceEquals(f1, f2));
          //这样引用也是可以的
        }
    }
    class Cde
    {
        int a;
        public Cde(int b)
        { a = b; }
    }
}

输出结果:
false
理由:f1和f2指向的不是相同的地址

  

1.2\ 实例Equals方法的实现

class Program
    {
        static void Main(string[] args)
        {
            Cde f1 = new Cde(2);
            Cde f2 = new Cde(2);

            Console.WriteLine(f1.Equals(f2));
            //f1是个对象,用对象对实例方法的引用

        }
    }
    class Cde
    {
        int a;
        public Cde(int b)
        { a = b; }
    }
    结果:false

  

1.3\静态Equals方法的实现

class Program
    {
        static void Main(string[] args)
        {
            Cde f1 = new Cde(2);
            Cde f2 = new Cde(2);
            Console.WriteLine(Equals(f1, f2));
            /*
            Console.WriteLine(Cde.Equals(f1, f2));
            这样也是可以的
             */
        }
    }
    class Cde
    {
        int a;
        public Cde(int b)
        { a = b; }
    }
    结果:false

  

1.4\ ==的实现:

class Program
    {
        static void Main(string[] args)
        {
            Cde f1 = new Cde(2);
            Cde f2 = new Cde(2);
            Console.WriteLine(f1==f2);

        }
    }
    class Cde
    {
        int a;
        public Cde(int b)
        { a = b; }
    }

    结果:false

  

1.5\要让结果为真的方法:

  • 这里,将f1的地址值赋值给f2,都指向了同一个地址,那么他们就是相等的了
class Program
    {
        static void Main(string[] args)
        {
            Cde f1 = new Cde(2);

            //这里是关键
            Cde f2 = f1;
            Console.WriteLine(f1==f2);
            f1.a = 43; f2.a = 22;
            Console.WriteLine(Equals(f1,f2));
            //输出结果还是真,此时,f1

            Console.WriteLine(f1.a);
            //输出结果是22,
            //因为没有为f2重新分配新的地址栈
        }
    }
    class Cde
    {
        int a;
        public Cde(int b)
        { a = b; }
    }

    结果:TRue
    理由:指向同一个地址

  

1.6\实例Equals()虚方法的重写:

class Program
    {
        static void Main(string[] args)
        {
            Cde f1 = new Cde(2);
            Cde f2 = new Cde(2);

            //f1.a = 2; f2.a = 2;
            Console.WriteLine(f1.Equals(f2));
            Console.WriteLine(f1.a);

        }
    }
    class Cde
    {
        public int a;
        public Cde(int b)
        { a = b; }

        //重写虚方法
        //方法逻辑:只判断属性的值是否相等,不判断地址是否相同
        public override bool Equals(object obj)//这里括号中的参数不能修改
        {
            //避免程序出错
            //加入obj为空或者obj类型不等于cde的类型,那么返回假,避免别的程序出错
            if ((obj == null) || (obj.GetType() != typeof(Cde))) return false;

            Cde f3 = (Cde)obj;//强制类型转换
            if (f3.a == this.a) return true;//f3的a与对象f1的a进行比较,因为是用f1来调用equals的方法.
            else return false;
        }
    }

  

原文地址:https://www.cnblogs.com/pancong-520/p/8401624.html

时间: 2024-11-13 08:41:02

教学-45 对象的相等的相关文章

canvas教学RenderingContext2D对象的属性

即2D绘图环境的属性 canvas 指向绘图环境的canvas对象,通过它来调用canvas的宽度和高度,调用context.canvas.width和context.canvas.height fillstyle 指定该绘图环境在图形操作中所使用的颜色渐变色和图案 font 在调用绘图环境对象的fillText()或strokeText()所使用的字型 globalAlpha 全局透明度,取0到1的值 globalCompsiteOperation 将某个物体绘制于某个物体之上 lineCap

随笔45 对象的序列化

① 对象的序列化:Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象.Java对象序列化就能够帮助我们实现该功能. ② 使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象.必须注意地是,对象序列化保存的是对象的"状态",即它的成员

项目教学法在高职生物统计附试验设计教学的实践

项目教学法实际上就是先由学生或教师在现实中选取一个项目,学生分组对项目进行讨论.写计划书.实施项目.演示项目结果,由学生阐述机理,最后由教师对学生的项目结果进行评估.项目教学法可以调动学生学习的兴趣,提高动手能力和协作精神. 项目教学法在教学理念上强调以学生为本,师生共创学习环境; 在教学目的上注重培养学生的综合素质; 在教学框架上重视以课本为基点,以项目为延伸,以学生独立完成项目为学习方式,以成果展示作为评价手段.学生根据项目主题,深入有关领域或现实社会,通过提出问题.调查研究.动手操作.表达

jsonConfig处理日期及对象级联问题

项目中经常用到ajax请求后台,返回给前台json对象字符串.有些实体包含字段可能有日期.list.以及级联对象情况.因此,我们需要有针对性处理, 例如日期date类型,我们要给它转为我们所想要的格式的日期字符串,返回给前台.list我们要去除掉,级联对象,只提取我们所需要的字段值. 例如实体product: 1 /** 2 * 3 */ 4 package com.hik.entity; 5 6 import java.util.ArrayList; 7 import java.util.Da

UI设计师零基础入门到精通精品视频教程【155课高清完整版】

[福吧资源网分享]课程是非常完整的,也是非常零基础的,适合任何学员,有需要的可以下载看看!课程目录:第1章 Adobe Photoshop CS6课时1 Adobe Photoshop CS6入门基础 52:24课时2 创建与编辑选区(上) 46:57课时3 创建与编辑选区(下) 48:59课时4 掌握图层与图层组(上) 48:01课时5 掌握图层与图层组(下) 57:35课时6 绘制位图图像(上) 47:46课时7 绘制位图图像(下) 46:37课时8 绘制矢量图形(上) 46:49课时9 绘

笨办法学 Python (Learn Python The Hard Way)

最近在看:笨办法学 Python (Learn Python The Hard Way) Contents: 译者前言 前言:笨办法更简单 习题 0: 准备工作 习题 1: 第一个程序 习题 2: 注释和井号 习题 3: 数字和数学计算 习题 4: 变量(variable)和命名 习题 5: 更多的变量和打印 习题 6: 字符串(string)和文本 习题 7: 更多打印 习题 8: 打印,打印 习题 9: 打印,打印,打印 习题 10: 那是什么? 习题 11: 提问 习题 12: 提示别人

第一天(内存管理)

1 手动内存管理基本概念 创建对象 1.分配内存空间,存储对象 2.初始化成员变量 3.反回对象的指针地址 //1.对象在完成创建的同时,内部会自动创建一个引用计数器,这个计数器,是系统用来判断是否回收对象的唯一依据,当我们的引用计数retainCount = 0的时候,系统会毫不犹豫回收当前对象 //2.[对象 release] reatinCount - 1 //3.[对象 retain] reatinCount + 1 ,返回self //4.我们的引用计数retainCount = 0的

Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序)

1. TreeSet存储自定义对象并遍历练习1(自然排序): (1)Student.java: 1 package cn.itcast_05; 2 3 /* 4 * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 5 */ 6 public class Student implements Comparable<Student> { 7 private String name; 8 private int age; 9 10 public Student() { 11 super

《Entity Framework 6 Recipes》中文翻译系列 (45) ------ 第八章 POCO之获取原始对象与手工同步对象图和变化跟踪器

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-6  获取原始对象 问题 你正在使用POCO,想从数据库获取原始对象. 解决方案 假设你有如图8-7所示的模型.你正在离线环境下工作,你想应用在获取客户端修改之前,使用Where从句和FirstDefault()方法从数据库中获取原始对象. 图8-7.包含一个单独实体Item的模型 按代码清单8-9的方式,在获取实体之后,使用新值更新实体并将其保存到数据库中. 代码清单8-9. 获取最新