boxing, unboxing

来源:互联网 发布:艾佛森 体测数据 编辑:程序博客网 时间:2024/05/01 14:50
 关于在.net中,什么时候boxing,什么时候unboxing,这里有段有趣的代码。

有段代码是要在List<>类型里储存多个数据,比如Student 数据,同一班级的Student的ClassId的值是相同的

            List<Student> listStudents = new List<Student>();            Student s1 = new Student();            s1.ClassId = "C001";            s1.StudentId = "S0001";            listStudents.Add(s1);            s1.StudentId = "S0002";            listStudents.Add(s1);            s1.StudentId = "S0003";            listStudents.Add(s1);            PrintStudentIds(listStudents);

执行的结果是

S0001S0002S0003

Student只有一个实例,为什么结果不是S0003 S0003 S0003?如果Student是Class,那么就是这个结果了,可是如果Student是struct,就会产生上面的结果。

因为List<>的Add方法的签名是,Add(object o),如果传递给方法一个struct类型,那么一次boxing就会发生,存入List是一个新生成的临时对象,当再次付给同一个struct的字段一个新值,再次调用Add方法,就再一次产生一个新的临时对象。所以最后List里保存的是一组临时对象,每个对象的StudentId字段都是不同的值。

原创粉丝点击