c#的值类型和引用类型(拆装箱)

1.值类型和引用类型

c#中所有的引用类型共同的基类是System.Object
1.管理机制
值类型:操作系统负责,作用域结束时被操作系统自动释放
引用类型:垃圾回收器负责
2.内存分配
值类型:值类型实例总会被分配到变量声明的地方
声明的是局部变量 被分配到栈上
声明的是引用类型成员的时候被分配到管理堆上
引用类型:实例总被分配到托管堆上
变量存储在栈中
3.赋值方式
值类型:复制变量包含的值
引用类型:复制对象引用(地址)
4.基类
值类型:继承System.ValueType;System.ValueType又继承自System.Object
引用类型:引用类型继承自System.Object

值类型:原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct)等,是在栈中分配内存,在申明的同时就初始化,以确保数据不为NULL;

引用类型:类、数组、接口、委托、字符串等,在堆中分配内存,初始化为null,引用型是需要GARBAGE COLLECTION来回收内存的,值型不用,超出了作用范围,系统就会自动释放;

拆装箱

拆装箱是比较抽象的概念
装箱就是把值类型转换为引用类型
用于在垃圾回收堆中存储值类型。装箱是值类型到object 类型或到此值类型所实现的任何接口类型的隐式转换。
拆箱就是翻过来 把引用类型转换为值类型,从object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。

 private void Start()
    {
        object obj = val;
        Debug.LogError("装箱过程(将值类型转换为引用类型的过程):" + obj);
        int num = (int)obj;
        Debug.LogError("拆箱过程(将值类型转换为引用类型,再由引用类型转换为值类型的过程):" + num);
        //判断拆箱后的类型
        if (obj is Vector3)
        {
            Debug.LogError((Vector3)obj+"是obj");
        }
        else if (obj is int)
        {
            Debug.LogError((int)obj + "是int") ;
        }
    }

所以为什么要拆装箱?
加入要调用一个含类型为object参数的方法,这个Object类型该Object可支持任意为型,以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。 另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时,需要装箱。

为什么要避免拆装箱
装箱其实就是把栈上的数据放到堆上去了。而拆箱就是把堆上的数据放在栈上。在拆箱和装箱的过程中,无可避免的多了数据转换,申请内存等。从而降低了性能。所以我们要避免装箱和拆箱。

这篇博客就分享这么多了
如果大家也是游戏开发爱好者 欢迎关注我 我会在这里持续更新我的学习过程

你可能感兴趣的:(游戏开发面试准备,c#)