建设家具网站,wordpress注册密码忘记,鞍山玉佛苑导游词,网络舆情分析报告转自: http://www.cnblogs.com/anding/p/5236739.html 常见面试题目: 1.什么是拆箱和装箱#xff1f; 2.什么是箱子#xff1f; 3.箱子放在哪里#xff1f; 4.装箱和拆箱有什么性能影响#xff1f; 5.如何避免隐身装箱#xff1f; 6.箱子的基本结构#xff1f; 7.装箱的…转自: http://www.cnblogs.com/anding/p/5236739.html 常见面试题目: 1.什么是拆箱和装箱 2.什么是箱子 3.箱子放在哪里 4.装箱和拆箱有什么性能影响 5.如何避免隐身装箱 6.箱子的基本结构 7.装箱的过程 8.拆箱的过程 9.下面这段代码输出什么共发生多少次装箱多少次拆箱 int i 5;
object obj i;
IFormattable ftt i;
Console.WriteLine(System.Object.ReferenceEquals(i, obj));
Console.WriteLine(System.Object.ReferenceEquals(i, ftt));
Console.WriteLine(System.Object.ReferenceEquals(ftt, obj));
Console.WriteLine(System.Object.ReferenceEquals(i, (int)obj));
Console.WriteLine(System.Object.ReferenceEquals(i, (int)ftt)); 深入浅出装箱与拆箱 有拆必有装有装必有拆。 在上一文中我们提到所有值类型都是继承自System.ValueType而System.ValueType又是来自何方呢不难发现System.ValueType继承自System.Object。因此Object是.NET中的万物之源几乎所有类型都来自她这是装箱与拆箱的基础。 特别注意的是本文与上一文有直接关联需要先了解上一文中值类型与引用类型的原理才可以更好理解本文的内容。 基本概念 拆箱与装箱就是值类型与引用类型的转换她是值类型和引用类型之间的桥梁他们可以相互转换的一个基本前提就是上面所说的Object是.NET中的万物之源 先看看一个小小的实例代码 int x 1023;object o x; //装箱int y (int) o; //拆箱 装箱值类型转换为引用对象一般是转换为System.Object类型或值类型实现的接口引用类型 拆箱引用类型转换为值类型注意这里的引用类型只能是被装箱的引用类型对象 由于值类型和引用类型在内存分配的不同从内存执行角度看拆箱与装箱就势必存在内存的分配与数据的拷贝等操作这也是装箱与拆箱性能影响的根源。 装箱的过程 int x 1023;
object o x; //装箱 装箱就是把值类型转换为引用类型具体过程 1.在堆中申请内存内存大小为值类型的大小再加上额外固定空间引用类型的标配TypeHandle和同步索引块2.将值类型的字段值x1023拷贝新分配的内存中3.返回新引用对象的地址给引用变量object o 如上图所示装箱后内存有两个对象一个是值类型变量x另一个就是新引用对象o。装箱对应的IL指令为box上面装箱的IL代码如下图 拆箱的过程 int x 1023;
object o x; //装箱
int y (int) o; //拆箱 明白了装箱拆箱就是装箱相反的过程简单的说是把装箱后的引用类型转换为值类型。具体过程 1.检查实例对象object o是否有效如是否为null其装箱的类型与拆箱的类型int是否一致如检测不合法抛出异常2.指针返回就是获取装箱对象object o中值类型字段值的地址3.字段拷贝把装箱对象object o中值类型字段值拷贝到栈上意思就是创建一个新的值类型变量来存储拆箱后的值 如上图所示拆箱后得到一个新的值类型变量y拆箱对应的IL指令为unbox拆箱的IL代码如下 装箱与拆箱总结及性能 装的的什么拆的又是什么什么是箱子 通过上面深入了解了装箱与拆箱的原理不难理解只有值类型可以装箱拆的就是装箱后的引用对象箱子就是一个存放了值类型字段的引用对象实例箱子存储在托管堆上。只有值类型才有装箱、拆箱两个状态而引用类型一直都在箱子里。 关于性能 之所以关注装箱与拆箱主要原因就是他们的性能问题而且在日常编码中经常有装箱与拆箱的操作而且这些装箱与拆箱的操作往往是在不经意时发生。一般来说装箱的性能开销更大这不难理解因为引用对象的分配更加复杂成本也更高值类型分配在栈上分配和释放的效率都很高。装箱过程是需要创建一个新的引用类型对象实例拆箱过程需要创建一个值类型字段开销更低。 为了尽量避免这种性能损失尽量使用泛型在代码编写中也尽量避免隐式装箱。 什么是隐式装箱如何避免 就是不经意的代码导致多次重复的装箱操作看看代码就好理解了 int x 100;
ArrayList arr new ArrayList(3);
arr.Add(x);
arr.Add(x);
arr.Add(x); 这段代码共有多少次装箱呢看看Add方法的定义 再看看IL代码可以准确的得到装箱的次数 显示装箱可以避免隐式装箱下面修改后的代码就只有一次装箱了。 int x 100;
ArrayList arr new ArrayList(3);
object o x;
arr.Add(o);
arr.Add(o);
arr.Add(o); 题目答案解析: 1.什么是拆箱和装箱 装箱就是值类型转换为引用类型拆箱就是引用类型被装箱的对象转换为值类型。 2.什么是箱子 就是引用类型对象。 3.箱子放在哪里 托管堆上。 4.装箱和拆箱有什么性能影响 装箱和拆箱都涉及到内存的分配和对象的创建有较大的性能影响。 5.如何避免隐身装箱 编码中多使用泛型、显示装箱。 6.箱子的基本结构 上面说了箱子就是一个引用类型对象因此她的结构主要包含两部分 值类型字段值引用类型的标准配置引用对象的额外空间TypeHandle和同步索引块关于这两个概念在本系列后面的文章会深入探讨。7.装箱的过程 1.在堆中申请内存内存大小为值类型的大小再加上额外固定空间引用类型的标配TypeHandle和同步索引块2.将值类型的字段值x1023拷贝新分配的内存中3.返回新引用对象的地址给引用变量object o8.拆箱的过程 1.检查实例对象object o是否有效如是否为null其装箱的类型与拆箱的类型int是否一致如检测不合法抛出异常2.指针返回就是获取装箱对象object o中值类型字段值的地址3.字段拷贝把装箱对象object o中值类型字段值拷贝到栈上意思就是创建一个新的值类型变量来存储拆箱后的值9.下面这段代码输出什么共发生多少次装箱多少次拆箱 int i 5;
object obj i;
IFormattable ftt i;
Console.WriteLine(System.Object.ReferenceEquals(i, obj));
Console.WriteLine(System.Object.ReferenceEquals(i, ftt));
Console.WriteLine(System.Object.ReferenceEquals(ftt, obj));
Console.WriteLine(System.Object.ReferenceEquals(i, (int)obj));
Console.WriteLine(System.Object.ReferenceEquals(i, (int)ftt)); 上面代码输出如下至于发生多少次装箱多少次拆箱你猜 False
False
False
False
False转载于:https://www.cnblogs.com/yan7/p/8397696.html