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
 

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

总结

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

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

请期待我的下一篇博客!

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

相关推荐
唐青枫7 小时前
C#.NET 定时任务与队列利器:Hangfire 完整教程
c#·.net
hez201013 小时前
Runtime Async - 步入高性能异步时代
c#·.net·.net core·clr
mudtools1 天前
.NET驾驭Word之力:玩转文本与格式
c#·.net
唐青枫1 天前
C#.NET 数据库开发提速秘籍:SqlSugar 实战详解
c#·.net
mudtools2 天前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
c#·.net
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法
echoarts2 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix2 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
大飞pkz2 天前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式
每天回答3个问题2 天前
UE5C++编译遇到MSB3073
开发语言·c++·ue5