C# 探险之旅:第三十七节 - 类型class之Object:万物之源的奇妙冒险

news/2024/12/16 11:58:40/

嘿,勇敢的探险家们!欢迎再次踏上C#的神秘之旅。今天,我们将深入探索一个极其强大又无处不在的“大佬”——Object 类型。想象一下,它就像是C#世界里的“超级英雄祖先”,几乎所有的类型都得叫它一声“老祖宗”。

Object 类:万物之源

Object 类是C#中所有类的基类。无论你定义什么类,它们都直接或间接地继承自Object类。你可以把Object类看作是所有类的“始祖”,它为所有的对象提供了一些通用的方法和属性,确保每个对象都能执行一些基本的操作。

Object 类的主要成员

Object 类提供了几个非常有用的方法和属性,这些成员在几乎所有对象中都可以使用:

  • ToString():返回对象的字符串表示形式。你可以用它来获取对象的描述信息。
  • Equals(object obj):比较两个对象是否相等。你可以用它来判断两个对象是否相同。
  • GetHashCode():返回对象的哈希码。哈希码用于在哈希表等数据结构中快速查找对象。
  • GetType():返回对象的运行时类型。你可以用它来获取对象的具体类型信息。
  • ReferenceEquals(object objA, object objB):静态方法,用于比较两个对象的引用是否相同。
使用 Object 类:超级英雄的共同技能

假设我们有一个SuperHero类,它代表了一个超级英雄。虽然每个超级英雄都有自己的独特能力,但他们都继承了Object类的一些通用方法。我们可以用这些方法来实现一些常见的操作。

public class SuperHero
{public string Name { get; set; }public int PowerLevel { get; set; }public void UsePower(){Console.WriteLine($"{Name} 使用了超能力!");}// 重写 ToString 方法,返回超级英雄的描述信息public override string ToString(){return $"{Name} (力量等级: {PowerLevel})";}// 重写 Equals 方法,比较两个超级英雄是否相同public override bool Equals(object obj){if (obj is SuperHero otherHero){return this.Name == otherHero.Name && this.PowerLevel == otherHero.PowerLevel;}return false;}// 重写 GetHashCode 方法,确保相同的对象有相同的哈希码public override int GetHashCode(){return HashCode.Combine(Name, PowerLevel);}
}

 在这个例子中,SuperHero类重写了Object类中的ToString()Equals()GetHashCode()方法,以便更好地描述和比较超级英雄。

实战演练:超级英雄的日常

让我们看看如何使用Object类的成员来处理超级英雄的日常事务。假设我们有两个超级英雄,我们可以用ToString()方法来描述他们,用Equals()方法来比较他们是否相同,还可以用GetType()方法来获取他们的类型信息。

SuperHero hero1 = new SuperHero
{Name = "闪电侠",PowerLevel = 100
};SuperHero hero2 = new SuperHero
{Name = "闪电侠",PowerLevel = 100
};SuperHero hero3 = new SuperHero
{Name = "超人",PowerLevel = 200
};// 使用 ToString 方法描述超级英雄
Console.WriteLine(hero1.ToString()); // 输出: 闪电侠 (力量等级: 100)
Console.WriteLine(hero2.ToString()); // 输出: 闪电侠 (力量等级: 100)// 使用 Equals 方法比较超级英雄
Console.WriteLine($"hero1 和 hero2 是否相同: {hero1.Equals(hero2)}"); // 输出: True
Console.WriteLine($"hero1 和 hero3 是否相同: {hero1.Equals(hero3)}"); // 输出: False// 使用 GetType 方法获取超级英雄的类型
Console.WriteLine($"hero1 的类型: {hero1.GetType()}"); // 输出: CSharpAdventure.SuperHero
Console.WriteLine($"hero3 的类型: {hero3.GetType()}"); // 输出: CSharpAdventure.SuperHero// 使用 ReferenceEquals 方法比较对象引用
Console.WriteLine($"hero1 和 hero2 的引用是否相同: {object.ReferenceEquals(hero1, hero2)}"); // 输出: False
public class SuperHero
{public string Name { get; set; }public int PowerLevel { get; set; }public void UsePower(){Console.WriteLine($"{Name} 使用了超能力!");}public override string ToString(){return $"{Name} (力量等级: {PowerLevel})";}public override bool Equals(object obj){if (obj is SuperHero otherHero){return this.Name == otherHero.Name && this.PowerLevel == otherHero.PowerLevel;}return false;}public override int GetHashCode(){return HashCode.Combine(Name, PowerLevel);}
}

我们来看看运行结果吧:

 

小结:成为代码世界的造物主

通过今天的学习,你已经掌握了如何使用Object类及其成员来处理对象的基本操作。Object类为所有的对象提供了通用的功能,确保每个对象都能执行一些基本的操作,比如转换为字符串、比较相等性、获取哈希码和类型信息。

Object类不仅是所有类的基类,还为我们提供了一套强大的工具,帮助我们在编写代码时更加灵活和高效。你可以把Object类看作是你手中的魔法书,里面记载了所有对象的共同技能,让你能够轻松地管理和操作各种类型的对象。

所以,下次当你坐在键盘前,准备编写一些代码时,不妨想想自己是一位造物主,正在精心设计一个充满各种神奇生物的世界。记住,Object类就是你手中的魔法书,让你的代码更加统一和强大。

继续前行吧,勇敢的探险家,C#的奇妙世界还有更多秘密等待你去发现!我们下一节再见!


http://www.ppmy.cn/news/1555580.html

相关文章

ESP32学习笔记_FreeRTOS(4)——Semaphore

摘要(From AI): 这篇博客详细介绍了 FreeRTOS 中二值信号量和计数信号量的基本概念、API 使用方法及实际应用场景,辅以完整的示例代码,适合初学者学习 前言:本文档是本人在依照B站UP:Michael_ee的视频教程进行学习时所做的学习笔…

什么叫中间件服务器?

什么叫中间件服务器?它在软件架构中扮演着怎样的角色?在现代应用程序开发中,中间件服务器的概念很多人对它并不太熟悉,但其实它的作用却不小。 中间件服务器是一种连接不同软件应用程序的中介。想象一下,在一个大型企…

【前端面试】前端工程化

文章目录 1. 什么是前端工程化2. 前端工程化的核心要素2.1 模块化2.2 组件化2.3 自动化2.4 标准化 3. 工程化工具链3.1 包管理工具3.2 构建工具3.3 测试工具3.4 CI/CD 工具 4. Webpack 面试题4.1 基础问题4.2 进阶问题4.3 原理问题 5. 前端工程化实践5.1 项目初始化5.2 开发环境…

2024年软件测试面试题大全【含答案】

一、面试基础题 简述测试流程: 1、阅读相关技术文档(如产品PRD、UI设计、产品流程图等)。 2、参加需求评审会议。 3、根据最终确定的需求文档编写测试计划。 4、编写测试用例(等价类划分法、边界值分析法等)。 5、用例评审(…

嵌入式入门工程-简单电子温度计(一)

先大致确定硬件 一个stm32f103C8最小系统作控制,DS8B20温度检测模块,8个LED数码管,74HC138D作3位到8位的扩展来作位选择,74HC245作信号放大来驱动数码管显示。 建立工程文件夹SimpleElectronicThermometer,开发keil5&…

macOS:安装第三方软件

基于安全性考虑,Mac 系统通常不允许安装那些从网络上下载下来的第三方软件包。 比如,在打开镜像盘时,报错为“该镜像已损坏,请移至废纸篓”,或者打开软件时提示“XXX 已损坏,打不开。您应该将它移到废纸篓”…

宽窄依赖/宽窄巷子——spark

宽窄依赖是用于标记算子是否需要shuffle过程的 ——本质:只是一种标记,标记两个RDD之间的依赖关系,用于判断是否需要进行shuffle 窄依赖:Narrow Dependencies 定义:父RDD的一个分区的数据只给了子RDD的一个分区 【不…

Devops-蓝鲸篇-03-蓝盾流水线简单介绍

BKCI流水线快速了解 BK-CI 可以帮你快速实现一条持续交付流水线来编译、测试、部署你的应用,下面将通过教程和文档指南告诉你,怎么在 BK-CI 里配置和管理持续集成、持续交付(CI/CD)流水线。 下面为流水线的完整逻辑图&#xff1…