答:装箱就是把值类型转换为引用类型,具体过程:1在堆中申请内存,内存大小为值类型的大小,再加上额外固定空间(引用类型的标配:TypeHa
dle和同步索引块);
f2将值类型的字段值拷贝新分配的内存中;
3返回新引用对象的地址(给引用变量objecto)
拆箱就是装箱相反的过程,简单的说是把装箱后的引用类型转换为值类型。
具体过程:
1检查实例对象(objecto)是否有效,如是否为
ull,其装箱的类型与
拆箱的类型(i
t)是否一致,如检测不合法,抛出异常;
2指针返回,就是获取装箱对象(objecto)中值类型字段值的地址;
3字段拷贝,把装箱对象(objecto)中值类型字段值拷贝到栈上,意思就
是创建一个新的值类型变量来存储拆箱后的值;
可以使用重载、泛型、接口等方式避免所带来的性能影响。
9
et反射有什么优点和缺点?如何优化反射?
答:反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活
性缺点是对性能有影响。
优化方案:Emit、DelegateCreateDelegate、dy
amic、Expressio
Trees、
缓存机制
10lock为什么要锁定一个参数,可不可锁定一个值类型?这个参数有
什么要求
答:lock的锁对象要求为一个引用类型。她可以锁定值类型,但值类型会
被装箱,每次装箱后的对象都不一样,会导致锁定无效。
lock是一个混合锁,其实质是Mo
itor。对于lock锁,锁定的这个对象参
数才是关键,这个参数的同步索引块指针会指向一个真正的锁(同步块),这个
锁(同步块)会被复用。
在使用Lock时,关键点就是锁对象了,需要注意以下几个方面:
这个对象肯定要是引用类型;
不要锁定this,尽量使用一个没有意义的Object对象来锁;
不要锁定一个类型对象,因类型对象是全局的;
不要锁定一个字符串,因为字符串可能被驻留,不同字符对象可能指向
同一个字符串;
不
要
使
用
fSystemRu
timeCompilerServicesMethodImplMethodImplOptio
sSy
chro
ized,这个可以使用在方法上面,保证方法同一时刻只能被一个线程调用。她实质上是使用lock的,如果是实例方法,会锁定this,如果是静态方法,则会锁定类型对象;
11下面代码输出结果是什么?为什么?如何改进i
ta0SystemThreadi
gTasksParallelFor0100000iaCo
soleWritea答:输出结果不稳定,小于等于100000。因为多线程访问,没有使用锁机制,会导致有更新丢失。改进如下:SystemThreadi
gI
terlockedAddrefa112以下代码执行后内存中会存在多少个字符串?分别是什么?输出结果是什么?为什么?stri
gs1