C#核心(16)万物之父和装箱拆箱

前言

西方说人类的万物之父是亚当,中国说人类的万物之母是女娲,那么c#中有没有一个万物之父呢?

有,我们今天就来浅浅聊一下。

在C#和许多其他面向对象编程语言中,"万物之父"指的是Object类。这个类的历史和重要性源于面向对象编程的基本原则和现代编程语言的发展。下面是对Object类历史背景的总结和为什么研究它的原因:

面向对象编程(OOP)起源于20世纪60年代和70年代的计算机科学,主要由语言如Simula和Smalltalk推动。OOP引入了类和对象的概念,使得程序更加模块化、可重用和易于维护。

C#在2000年由微软发布时,设计理念受到了Java等其他OOP语言的影响。在C#中,Object类被定义为所有类的基类,它提供了一些基础方法,供所有对象使用。

研究Object类有助于深入了解面向对象编程的核心概念,包括封装、多态和继承等。

理解如何利用Object类的功能可以帮助你更好地编写模块化代码,提高代码的重用性和可维护性。

在C#中,类型安全是非常重要的,研究Object类的行为可以帮助开发者更好地理解C#的类型系统,从而避免潜在的错误,提高程序的健壮性。

在实际开发中,使用Object类的能力可以使得开发者更灵活地处理多样的对象类型。例如:

  • 实现泛型集合中的多种类型。
  • 通过反射操作类型信息。
  • 在编写通用的方法和库时,允许不同类型间的交互。

当然我泛泛而谈这些你可能听不懂,你只用知道,这个东西是c#所有类型的爸爸就可以了。

万物之父object

关键字:object

概念:是所有类型的基类,用object容器装所有对象

使用方面:

  1. 可以利用里氏替换原则。用它装所有对象
  2. 可以用来表示不确定的类型作为函数参数类型

万物之父的使用

csharp 复制代码
using System;

class Program
{
    static void Main(string[] args)
    {
        // 引用类型
        object obj1 = new MyClass();
        Console.WriteLine(obj1.GetType()); // 输出:MyClass

        // 值类型
        object obj2 = 123;
        Console.WriteLine(obj2.GetType()); // 输出:System.Int32

        // string类型
        object obj3 = "Hello World";
        Console.WriteLine(obj3.GetType()); // 输出:System.String

        // 数组
        object obj4 = new int[] { 1, 2, 3, 4, 5 };
        Console.WriteLine(obj4.GetType()); // 输出:System.Int32[]
        //你可以试着用object给其他类型赋值,但需要用as或者is,或者括号强转,这个你自己下去摸索
    }
}

class MyClass
{
    // 自定义类
}
 

装箱和拆箱

发生条件:object存值类型(装),object转为值(拆)

装箱:值类型用引用类型存储,栈内存会迁移到堆内存上

拆箱:引用类型存储的值类型取出来用,堆内存会迁移到栈内存上

装箱示意图(拆箱则相反)

好处:不确定类型时可以方便参数的存储和传递

坏处:内存迁移,性能消耗

csharp 复制代码
int i = 42; // 值类型变量
object obj = i; // 装箱操作

Console.WriteLine(obj.GetType()); // 输出 System.Int32
 
csharp 复制代码
object obj = 42; // 装箱后的对象
int i = (int)obj; // 拆箱操作

Console.WriteLine(i); // 输出 42
 

以上为代码示例,你可以自己下去找点视频加深理解。

总结

万物之父的牵出,其实也是继承中的一个重要一环,我们介绍了类型们共同的父亲。装箱拆箱相对复杂一些,需要你好好理解,因为其实这涉及到一些计算机存储方面的知识。

还是那句话,学习路上,脚踏实地。

请期待我的下一篇博客!

我来自佑梦游戏开发,感谢你的关注和收藏!

相关推荐
EndingCoder31 分钟前
案例研究:从 JavaScript 迁移到 TypeScript
开发语言·前端·javascript·性能优化·typescript
Yyyyy123jsjs31 分钟前
如何通过免费的外汇API轻松获取实时汇率数据
开发语言·python
白露与泡影39 分钟前
2026版Java架构师面试题及答案整理汇总
java·开发语言
一个天蝎座 白勺 程序猿1 小时前
KingbaseES查询逻辑优化深度解析:从子查询到语义优化的全链路实践
开发语言·数据库·kingbasees·金仓数据库
skywalker_112 小时前
Java中异常
java·开发语言·异常
2501_940315262 小时前
航电oj:首字母变大写
开发语言·c++·算法
没有天赋那就反复2 小时前
JAVA 静态方法
java·开发语言
Thomas_YXQ2 小时前
Unity3D在ios平台下内存的优化详解
开发语言·macos·ios·性能优化·cocoa
咸甜适中2 小时前
rust的docx-rs库,自定义docx模版批量生成docx文档(逐行注释)
开发语言·rust·docx·docx-rs