stsfld vs stfld

Dus*_*vis 2 .net il

查看stfld和stsfld il操作码之间的区别,stfld具有空引用检查,而stsfld则没有.为什么是这样?是因为静态字段在高频堆上,所以它们不是垃圾收集的吗?

http://msdn.microsoft.com/library/system.reflection.emit.opcodes.stfld.aspx

堆栈过渡行为按顺序排列:

  1. 将对象引用或指针推入堆栈.
  2. 值被压入堆栈.
  3. 从堆栈中弹出值和对象引用/指针; 对象中字段的值将替换为提供的值.

stfld指令替换对象字段的值(类型O)或通过指针(类型native int,&或*)替换给定值.Field是一个引用字段成员引用的元数据标记.stfld指令可以具有Unaligned和Volatile之一或两者的前缀.

如果对象引用或指针是空引用并且该字段不是静态的,则抛出NullReferenceException.

如果在元数据中找不到字段,则抛出MissingFieldException.当Microsoft中间语言(MSIL)指令转换为本机代码时,通常会检查此项,而不是在运行时.

Mar*_*ell 7

静态成员永远不会有目标实例.如果有参数(在方法上),arg0引用第一个参数,而不是目标实例(aka this).由于没有target-instance,因此null检查毫无意义:没有任何解除引用的方法.