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
 

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

总结

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

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

请期待我的下一篇博客!

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

相关推荐
北冥you鱼2 分钟前
Go flag 包详解:从命令行解析到实战应用
开发语言·后端·golang
web守墓人44 分钟前
【python】uv解决依赖安装缓慢的问题
开发语言·python·uv
asdzx671 小时前
使用 Python 精准操控 Word 字体:获取与替换方案
python·c#·word
geovindu2 小时前
CSharp: Bridge Pattern
开发语言·后端·桥接模式·结构型模式
এ慕ོ冬℘゜2 小时前
深入 JavaScript BOM:掌握 window 对象的窗口控制魔法
开发语言·javascript·ecmascript
2501_941982052 小时前
企业微信二次开发:如何用 Python 搭建通用的 Webhook 实时消息接收
开发语言·python·企业微信
逝水无殇3 小时前
C# 特性详解
开发语言·后端·c#
灵晔君3 小时前
【C++】二叉搜索树
开发语言·c++
LongtengGensSupreme3 小时前
C#图像内存高速拷贝:使用Marshal.AllocHGlobal与ArrayPool实现内存拷贝的几个方法
开发语言·数码相机·c#
Java面试题总结3 小时前
Python,单引号和双引号有何区别
开发语言·python