查看stfld和stsfld il操作码之间的区别,stfld具有空引用检查,而stsfld则没有.为什么是这样?是因为静态字段在高频堆上,所以它们不是垃圾收集的吗?
http://msdn.microsoft.com/library/system.reflection.emit.opcodes.stfld.aspx
堆栈过渡行为按顺序排列:
- 将对象引用或指针推入堆栈.
- 值被压入堆栈.
- 从堆栈中弹出值和对象引用/指针; 对象中字段的值将替换为提供的值.
stfld指令替换对象字段的值(类型O)或通过指针(类型native int,&或*)替换给定值.Field是一个引用字段成员引用的元数据标记.stfld指令可以具有Unaligned和Volatile之一或两者的前缀.
如果对象引用或指针是空引用并且该字段不是静态的,则抛出NullReferenceException.
如果在元数据中找不到字段,则抛出MissingFieldException.当Microsoft中间语言(MSIL)指令转换为本机代码时,通常会检查此项,而不是在运行时.
静态成员永远不会有目标实例.如果有参数(在方法上),arg0引用第一个参数,而不是目标实例(aka this).由于没有target-instance,因此null检查毫无意义:没有任何解除引用的方法.
| 归档时间: |
|
| 查看次数: |
1982 次 |
| 最近记录: |