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
 

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

总结

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

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

请期待我的下一篇博客!

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

相关推荐
wlyang66617 分钟前
4. scala高阶之隐式转换与泛型
大数据·开发语言·后端·spark·scala
JovaZou2 小时前
[Python学习日记-75] 计算机基础与网络
开发语言·网络·python·网络协议·学习·tcp/ip·计算机网络
五行星辰4 小时前
Servlet与JSP:Java的秘密花园入口
java·开发语言·servlet
代码驿站5205 小时前
Scala语言的软件工程
开发语言·后端·golang
Code花园5 小时前
Objective-C语言的多线程编程
开发语言·后端·golang
Rverdoser5 小时前
接口项目架构流程图-thinkphp6-rabbitmq
开发语言·microsoft·ruby
Jelena技术达人5 小时前
利用 Python 爬虫获取 1688 关键字 API 接口
开发语言·爬虫·python
graceyun5 小时前
C语言初阶习题【23】输出数组的前5项之和
c语言·开发语言·算法
喵手6 小时前
Java中将特征向量转换为矩阵的实现
java·开发语言·矩阵
晚安~~7 小时前
协同过滤算法商品推荐系统|Java|SpringBoot|VUE|
java·开发语言·maven