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

article/2025/7/16 4:47:58

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)); //FalseConsole.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)); //FalseConsole.WriteLine(Equals(point1, point2));  //TrueConsole.WriteLine(ReferenceEquals(daily1, daily2)); //FalseConsole.WriteLine(Equals(daily1, daily2));  //TrueType type = student1.GetType();Console.WriteLine(type.ToString()); //LearnObject.StudentStudent 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());  //18643596Console.WriteLine(student7.ToString()); //自定义输出,学生的名字:张飞,年龄:18Console.WriteLine(student8.ToString()); //LearnObject.Student2}}
}

6、参考资料:

  1. 《唐老狮C#》

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

在这里插入图片描述


http://www.hkcw.cn/article/npqkxTGuio.shtml

相关文章

ollama国内安装使用

解决国内下载慢和安装卡住问题 docker安装-优先推荐 https://hub.docker.com/r/ollama/ollama/tags docker pull ollama/ollama:latestGitHub 镜像加速 改安装脚本、使用 GitHub 镜像和文件加速服务 https://defagi.com/ai-case/ollama-installation-guide-china/ modelsco…

阻塞队列的学习以及模拟实现一个阻塞队列

前言 今天上午学习了阻塞队列。之前在数据结构的时候,学过队列。把队列放在多线程中,对队列会有新的体会。我自己也实现了一个阻塞队列结合生产消费模型,希望对于大家有帮助~ 阻塞队列的相关知识 结语 本次的分享就结束啦。端午安康~

深度学习赋能图像识别:技术、应用与展望

论文: 一、引言​ 1.1 研究背景与意义​ 在当今数字化时代,图像作为信息的重要载体,广泛存在于各个领域。图像识别技术旨在让计算机理解和识别图像内容,将图像中的对象、场景、行为等信息转化为计算机能够处理的符号或数据 &am…

如何通过一次需求评审,让项目效率提升50%?

想象一下,你的团队启动了一个新项目,但需求模糊不清,开发到一半才发现方向错了,返工、加班、客户投诉接踵而至……听起来像噩梦?一次完美的需求评审就能避免这一切!它就像项目的“导航仪”,确保…

粽叶飘香时 山水有相逢

粽叶飘香时 山水有相逢 尊敬的广大客户们: 五月初五,艾叶幽香。值此端午佳节,衡益科技全体同仁向您致以最诚挚的祝福! 这一年我们如同协同竞渡的龙舟,在数字化转型的浪潮中默契配合。每一次技术对接、每轮方案优化&a…

【PyTroch学习-001】从一个简单示例开始:手写数字识别

一、PyTroch简介 PyTorch 是由 Meta(原 Facebook)开发的开源深度学习框架,以动态计算图和易用性著称,广泛应用于计算机视觉、自然语言处理等领域。其核心特性包括: ​动态计算图​:支持运行时灵活调整计算…

备战2025全国青少年信息素养大赛省赛—图形化编程—每一练——打开密码锁

备战2025全国青少年信息素养大赛省赛—图形化编程—每一练——打开密码锁 题目可看下方去处,支持在线编程,在线获取源码和素材~ 打开密码锁_scratch_少儿编程题库学习中心-嗨信奥 题库收集了历届各白名单赛事真题和权威机构考级真题&#xf…

MPLS的基础配置

MPLS概念(AI) ‌MPLS(多协议标签交换)的工作原理是通过标签(Label)引导数据转发,将固定长度的短标签与数据分组封装,交换节点仅根据标签进行快速转发,从而提升网络传输效…

一篇文章玩转CAP原理

CAP 原理是分布式系统设计的核心理论之一,揭示了系统设计中的 根本性权衡。 一、CAP 的定义 CAP 由三个核心属性组成,任何分布式系统最多只能同时满足其中两个: 一致性(Consistency) 所有节点在同一时刻看到的数据完全…

AI FOR SCIENCE 2025 报告解读

《AI FOR SCIENCE 2025》梳理了人工智能在科学研究各领域的应用现状、关键挑战与未来趋势,并提出了相应的政策建议。 一、报告概述 发布机构: 复旦大学、上海科学智能研究院(SAIS)、自然科研智讯(Nature Research In…

CppCon 2014 学习第5天:Where did my performance go

我的性能去哪儿了 主题简介: 如何为一个并发程序生成详细且有用的性能分析信息(事件时间线)。 我们将讨论: 为什么我们需要这样做?我们要解决什么问题? ⟶ 并发程序性能难以调优,调试更难&…

将ipynb文件转换为markdown格式文件

文章目录 将ipynb文件转换为markdown格式文件nbconvert 包安装nbconvert 使用 将ipynb文件转换为markdown格式文件 有时候,我们需要把Jupyter notebook的.ipynb格式文件转换为markdown格式.md,便于使用。 那么,我们可以通过安装nbconvert包&a…

在日常管理服务器中如何防止SQL注入与XSS攻击?

在日常管理服务器时,防止SQL注入(Structured Query Language Injection)和XSS(Cross-Site Scripting)攻击是至关重要的,这些攻击可能会导致数据泄露、系统崩溃和信息泄露。以下是一份技术文章,介…

ToolsSet之:十六进制及二进制编辑运算工具

ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用,应用基本功能介绍可以查看以下文章: Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264 ToolsSet中Number菜单下的Hex Operate工具可以进…

利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法

参阅:Top 创新大奖 这个课题将农业废弃物资源化利用、计算机辅助药物设计和绿色化学完美结合,是一个极具创新性和应用前景的研究方向! 以下是如何利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法的系统思路: 核心思路 玉…

什么是AI Agent?大白话新手教学

Agent的诞生背景 如果只有LLM的话,那么LLM就相当于一个脑子,你问他一个问题,他会给你答案或者告诉你怎么做,但并不会帮你去解决这个问题,实际还是需要你自己动手去解决。 (比如我问大模型:“我要…

Unity链接Mysql 数据库实现注册登录

1.搭建注册和登录的UI以及跳转代码撰写 2.安装Mysql 数据库到服务器或者本地电脑 我这里使用的是小皮工具,安装玩数据库后创建一个新的用户以及表格 安装Navicate 链接数据库,方便可视化数据库 点击查询-新建查询-输入命令-运行!完成表格创…

你了解ConcurrentHashMap吗?ConcurrentHashMap九连问

多线程环境下,使用Hashmap进行put操作会造成数据覆盖,应该使用支持多线程的 ConcurrentHashMap。 HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进行put操作,调用了HashMap的putVal(),具体原因: 假设两…

Pyenv 使用指南:多版本 Python 环境管理

目录 Pyenv 是什么?安装 Pyenv管理 Python 版本虚拟环境管理项目级 Python 版本控制高级技巧常见问题解决最佳实践 Pyenv 是什么? Pyenv 是一个强大的 Python 版本管理工具,允许你: 在同一台机器上安装多个 Python 版本轻松切换…

Cursor 玩转 腾讯地图 MCP Server

腾讯地图WebService API 服务简介 腾讯地图WebService API 是基于HTTPS/HTTP协议构建的标准化地理数据服务接口。该接口支持跨平台调用,开发者可使用任意客户端、服务器端技术及编程语言,遵循API规范发起HTTPS请求,获取地理信息服务&#xf…