20250530-C#知识:万物之父Object

news2025/7/23 19:01:39

C#知识:万物之父Object

Object类(即object)是所有类的基类,这里面的方法还是需要好好了解一下。


1、Object类

  • 是顶级父类,其他类默认都是Object类的子类(自定义类也会默认继承Object类)
  • 可以用Object变量装载值类型和其他自定义类型对象
  • Object类是引用类型
  • 存在装箱拆箱
    在这里插入图片描述
object x = 100; //装箱
int y = (int)x; //拆箱

2、Object类中的静态方法

2.1 静态方法Equals

  • 判断两个参数是否相等
  • 调用第一个参数的虚拟Equals方法进行判断,无论值类型和引用类型
public static bool Equals(object? objA, object? objB);

2.2 静态方法ReferenceEquals

  • 比较两个引用类型对象是否相等
  • 传递值类型则返回false
public static bool ReferenceEquals(object? objA, object? objB);

3、Object类的成员方法

3.1 普通方法GetType

  • 返回对象类型的Type对象,可用于反射
public extern Type GetType();

3.2 普通方法MemberwiseClone

  • 获取对象的浅拷贝对象
  • 对象的引用类型成员变量也是直接拷贝,指向堆中相同位置
protected unsafe object MemberwiseClone();

4、Object类的虚拟方法

4.1 虚拟方法Equals

  • 只有一个参数,将调用方法的对象与参数对象进行比较
  • 引用类型比较引用(默认)
  • 值类型比较值是否相等,因为System.ValueType中重写了该方法
  • 测试了枚举和结构体,也符合值类型的比较规则
public virtual bool Equals(object? obj)

4.2 虚拟方法GetHashCode

  • 获取对象哈希值
public virtual int GetHashCode()

4.3 虚拟方法ToString

  • 将对象进行打印输出时默认调用此方法
public virtual string? ToString()

5、完整测试用例:

namespace LearnObject
{
    enum Daily
    {
        Eat,
        Sleep
    }
    struct Point
    {
        public int x;
        public int y;

        public Point():this(0,0) { }
        public Point(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }
    class Student
    {
        public string name;
        public int age;
        public Teacher teacher;


        public Student():this("张飞",18, new Teacher()) { }

        public Student(string name, int age)
        {
            this.name = name;
            this.age = age;
            this.teacher = new Teacher();
        }
        public Student(string name, int age, Teacher teacher) : this(name, age)
        {
            this.teacher = teacher;
        }

        public override bool Equals(Object? a)
        {
            if (a != null && a is Student)
            {
                Student other = a as Student;
                return this.name.Equals(other.name) && this.age == other.age;
            }
            return false;
        }

        public override int GetHashCode()
        {
            Console.WriteLine($"重写之前的哈希值: {base.GetHashCode()}");
            return 10086;   //自定义哈希逻辑
        }

        public override string ToString()
        {
            return $"自定义输出,学生的名字:{this.name},年龄:{this.age} \n" ;
        }

        public Student ShallowClone() => this.MemberwiseClone() as Student;
    }

    class Student2
    {
        public string name;
        public int age;
        public Teacher teacher;

        public Student2() : this("张飞", 18, new Teacher()) { }

        public Student2(string name, int age)
        {
            this.name = name;
            this.age = age;
            this.teacher = new Teacher();
        }

        public Student2(string name, int age, Teacher teacher) : this(name, age)
        {
            this.teacher = teacher;
        }

        public Student2 ShallowClone() => this.MemberwiseClone() as Student2;
    }

    class Teacher
    {
        public string name;

        public Teacher() { this.name = "诸葛亮"; }

        public Teacher(string name)
        {
            this.name = name;
        }   
    }
    internal class Program
    {
        static void Main(string[] args)
        {

            object x = 100; //装箱
            int y = (int)x; //拆箱
            
            Student student1 = new Student();
            Student student2 = new Student();
            Student2 student3 = new Student2();
            Student2 student4 = new Student2();
            Console.WriteLine(Equals(student1, student2));  //True  //因为Student中Equals方法被重写了
            Console.WriteLine(Equals(student3, student4));  //False //因为Student2默认比较的是引用

            Console.WriteLine(ReferenceEquals(student1, student2)); //False
            Console.WriteLine(ReferenceEquals(5, 5));
            Point point1 = new Point(1, 1); //测试结构体
            Point point2 = new Point(1, 1);
            Daily daily1 = Daily.Sleep; //测试枚举
            Daily daily2 = Daily.Sleep;
            Console.WriteLine(ReferenceEquals(point1, point2)); //False
            Console.WriteLine(Equals(point1, point2));  //True
            Console.WriteLine(ReferenceEquals(daily1, daily2)); //False
            Console.WriteLine(Equals(daily1, daily2));  //True

            Type type = student1.GetType();
            Console.WriteLine(type.ToString()); //LearnObject.Student

            Student student5 = new Student("关羽",20, new Teacher("诸葛亮"));
            Student student6 = student5.ShallowClone();
            Console.WriteLine("修改前");
            Console.WriteLine($"学生5:{student5.name}的老师是{student5.teacher.name}");   //学生5:关羽的老师是诸葛亮
            Console.WriteLine($"学生6:{student6.name}的老师是{student6.teacher.name}");   //学生6:关羽的老师是诸葛亮

            student6.name = "刘备";
            student5.teacher.name = "庞士元";
            Console.WriteLine("学生6修改后");
            Console.WriteLine($"学生5:{student5.name}的老师是{student5.teacher.name}");   //学生5:关羽的老师是庞士元
            Console.WriteLine($"学生6:{student6.name}的老师是{student6.teacher.name}");   //学生6:刘备的老师是庞士元

            Student student7 = new Student();
            Student2 student8 = new Student2();
            Console.WriteLine(student7.GetHashCode());  //10086 
            Console.WriteLine(student8.GetHashCode());  //18643596
            Console.WriteLine(student7.ToString()); //自定义输出,学生的名字:张飞,年龄:18
            Console.WriteLine(student8.ToString()); //LearnObject.Student2
        }
    }
}


6、参考资料:

  1. 《唐老狮C#》

本篇结束,感想您的阅阅阅阅阅阅阅阅阅读~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2397872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多元素纳米颗粒:开启能源催化新纪元

在能源转型的浪潮中,纳米催化剂正成为推动能源技术突破的关键力量。多元素纳米颗粒(Polyelemental Nanoparticles)凭借其独特的元素协同效应,展现出在能源催化领域的巨大潜力。然而,合成这些复杂体系的纳米颗粒面临着诸…

分布式锁优化:使用Lua脚本保证释放锁的原子性问题

分布式锁优化(二):使用Lua脚本保证释放锁的原子性问题 💻黑马视频链接:Lua脚本解决多条命令原子性问题 在上一章节视频实现了一个可用的Redis分布式锁,采用SET NX EX命令实现互斥和过期自动释放机制&…

电脑wifi显示已禁用怎么点都无法启用

一、重启路由器与电脑 有时候,简单的重启可以解决很多小故障。试着先断开电源让路由器休息一会儿再接通;对于电脑,则可选择重启系统看看情况是否有改善。 二、检查驱动程序 无线网卡驱动程序的问题也是导致WiFi无法启用的常见原因之一。我…

【FPGA开发】Ubuntu16.04环境下配置Vivado2018.3—附软件包

文章目录 环境介绍关键步骤记录安装虚拟机及镜像安装vivadolicense导入 环境介绍 vivado:2018.3 虚拟机:vmware 16 pro 镜像:Ubuntu16.04 64位 所有相关软件压缩包: 链接:https://pan.quark.cn/s/fd2730b46b20 提取码…

vue-seamless-scroll 结束从头开始,加延时后滚动

今天遇到一个大屏需求: 1️⃣初始进入页面停留5秒,然后开始滚动 2️⃣最后一条数据出现在最后一行时候暂停5秒,然后返回1️⃣ 依次循环,发现vue-seamless-scroll的方法 ScrollEnd是监测最后一条数据消失在第一行才回调&#xff…

0-EATSA-GNN:基于图节点分类师生机制的边缘感知和两阶段注意力增强图神经网络(code)

code:https://github.com/afofanah/EATSA-GNN. 文章目录 Abstract1. Introduction1.1.动态图场景1.2.EATSA-GNN框架的背景化2. Background2.1.GNN边缘感知挑战2.2.GNN的可解释性问题2.3.EATSA-GNN可解释性3. Related worksAbstract 图神经网络(GNNs)从根本上改变了我们处理和…

配置前端控制器

一、DispatcherServlet 详解 在使用 Spring MVC 框架构建 Web 应用时,DispatcherServlet是整个请求处理流程的核心。本文将深入解析DispatcherServlet的作用、工作原理及其在 Spring MVC 架构中的关键地位。 1.DispatcherServlet 是什么? DispatcherS…

lua注意事项

感觉是lua的一大坑啊,它还不如函数内部就局部变量呢 注意函数等内部,全部给加上local得了

Git的三种合并方式

在 Gitee(码云)中合并分支主要有三种方式:​普通合并(Merge Commit)、压缩合并(Squash Merge)​和变基合并(Rebase Merge)​。每种方式适用于不同的场景,各有…

从零到一:我的技术博客导航(持续更新)

作者:冰茶 最后更新:2025年6月3日 本文收录了我的C#编程学习心得与技术探索,将持续更新 前言 作为一名.NET开发者,C#语言的学习与探索一直是我技术成长的核心路径。本文集整理了我在C#学习过程中的思考与实践,希望能够…

SpringBoot整合Flowable【08】- 前后端如何交互

引子 在第02篇中,我通过 Flowable-UI 绘制了一个简单的绩效流程,并在后续章节中基于这个流程演示了 Flowable 的各种API调用。然而,在实际业务场景中,如果要求前端将用户绘制的流程文件发送给后端再进行解析处理,这种…

【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN

【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN 目录 【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-LSTM、Transformer、CNN-LSTM、LSTM、…

深入了解MCP基础与架构

一、引言 在人工智能技术以指数级速度渗透各行业领域的今天,我们正站在一个关键的技术拐点。当ChatGPT月活突破亿级、Gemini Pro实现多模态实时交互、Claude 3.5 Sonnet突破百万上下文长度,这些里程碑事件背后,一个崭新的大门逐步打开&#…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.13 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.13 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图。 dataframe<-data.frame( yc(36,18,30,39,20…

【java面试】MySQL篇

MySQL篇 一、总体结构二、优化&#xff08;一&#xff09;定位慢查询1.1 开源工具1.2Mysql自带的慢日志查询1.3 总结 &#xff08;二&#xff09;定位后优化2.1 优化2.2 总结 &#xff08;三&#xff09;索引3.1 索引3.2 索引底层数据结构——B树3.3 总结 &#xff08;四&#…

贪心算法应用:欧拉路径(Fleury算法)详解

Java中的贪心算法应用&#xff1a;欧拉路径&#xff08;Fleury算法&#xff09;详解 一、欧拉路径与欧拉回路基础 1.1 基本概念 欧拉路径&#xff08;Eulerian Path&#xff09;是指在一个图中&#xff0c;经过图中每一条边且每一条边只经过一次的路径。如果这条路径的起点和…

【算法设计与分析】实验——二维0-1背包问题(算法分析题:算法思路),独立任务最优调度问题(算法实现题:实验过程,描述,小结)

说明&#xff1a;博主是大学生&#xff0c;有一门课是算法设计与分析&#xff0c;这是博主记录课程实验报告的内容&#xff0c;题目是老师给的&#xff0c;其他内容和代码均为原创&#xff0c;可以参考学习&#xff0c;转载和搬运需评论吱声并注明出处哦。 要求&#xff1a;3-…

【Git】View Submitted Updates——diff、show、log

在 Git 中查看更新的内容&#xff08;即工作区、暂存区或提交之间的差异&#xff09;是日常开发中的常见操作。以下是常用的命令和场景说明&#xff1a; 文章目录 1、查看工作区与暂存区的差异2、查看提交历史中的差异3、查看工作区与最新提交的差异4、查看两个提交之间的差异5…

deepseek原理和项目实战笔记2 -- deepseek核心架构

混合专家&#xff08;MoE&#xff09; ​​混合专家&#xff08;Mixture of Experts, MoE&#xff09;​​ 是一种机器学习模型架构&#xff0c;其核心思想是通过组合多个“专家”子模型&#xff08;通常为小型神经网络&#xff09;来处理不同输入&#xff0c;从而提高模型的容…

在 MATLAB 2015a 中如何调用 Python

在 MATLAB 2015a 中调用 Python 可通过系统命令调用、.NET 交互层包装、MEX 接口间接桥接、环境变量配置四种方式&#xff0c;但因该版本对 Python 支持有限&#xff0c;主要依赖的是系统命令调用与间接脚本交互。其中&#xff0c;通过 system() 函数调用 Python 脚本是最简单且…