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
 

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

总结

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

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

请期待我的下一篇博客!

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

相关推荐
丰锋ff几秒前
基于 Qt 的智能门禁系统(二)
开发语言·qt
rockey62710 分钟前
C#脚本引擎之AScript与Jurassic、Jint对比
javascript·c#·.net·js·script·动态脚本
fpcc12 分钟前
跟我学C++中级篇——编译期的条件选择
开发语言·c++
SomeB1oody26 分钟前
【RustyML入门】6.3. 并行归约
开发语言·后端·机器学习·rust·教程
mqiqe2 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
lzhdim2 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
脉动数据行情2 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股
爱学习的小邓同学2 小时前
Golang --- (1)第一个Golang程序
开发语言·后端·golang
zx_741484813 小时前
【Python 入门】面向对象基础:类、对象、成员变量与构造方法
开发语言·python
惊鸿醉3 小时前
Unity 实战:用讯飞 WebAPI 做一个“说普通话、播方言“的语音程序
unity·c#·游戏引擎·语音识别