Unity C# 基础复习20——泛型集合、拆箱与装箱(P392)

一、数组和集合的比较

1、数组声明了元素类型,但集合没有,因为集合中所用元素都存储为对象。数组的大小是固定的,不能增加和减少;而集合类可根据需要动态调整大小。

2、检索元素的方式不同。

二、装箱与拆箱

1.装箱在值类型向引用类型转换时发生
object obj =1;
这行语句将整型常量1赋给object类型的变量obj;众所周知常量1是值
类型,值类型是要放在栈上的,而object是引用类型,它需要放在堆
上;要把值类型放在堆上就需要执行一次装箱操作。
以上就是装箱所要执行的操作了,执行装箱操作时不可避免的要在堆上
申请内存空间,并将堆栈上的值类型数据复制到申请的堆内存空间
上,这肯定是要消耗内存和cpu资源的。
2.拆箱在引用类型向值类型转换时发生
object objValue =4;
int value =(int)objValue;
上面的两行代码会执行一次装箱操作,将整型数字常量4装箱成引用类
型object变量objValue;然后又执行一次拆箱操作,将存储到堆上的引
用变量objValue存储到局部整形值类型变量value中。
拆箱操作的执行过程和装箱操作过程正好相反,是将存储在堆上的引用
类型值转换为值类型并给值类型变量。

三、装箱拆箱示意

 四、测试代码图示(对比ArrayList和泛型List<T>)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;

namespace Test01
{
    class Student 
    {

    }
    class Teacher 
    {

    }
    class Program
    {
        static void Main(string[] args)
        {
            TestList();
        }

        public static void TestList() 
        {
            //非泛型的情况
            ArrayList stus = new ArrayList();
            stus.Add(new Teacher());     //存入Teacher类
            for (int i = 0; i < stus.Count; i++)
            {
                //Student s = (Student)stus[i];  //强制转成Student类会报错
                //需要写一个判断是否为Student类,是的话才能放入
                if (stus[i] is Student)
                {
                    Student s = (Student)stus[i];  
                }
            }

            //泛型List<>
            List<Student> list = new List<Student>();   //只收Student类型
            //list.Add(new Teacher());   //无法放入,会报错
            list.Add(new Student());


            List<Student> list = new List<Student>();
            list.Add(new Student());
        }

    }
}

1、带泛型的集合,用于规避掉某些类型转换错误,具有专一性

2、如果要求Teacher类和Student类放入一个集合当中,则可以使用ArrayList

猜你喜欢

转载自blog.csdn.net/weixin_46711336/article/details/124845708