IL:ldfld vs ldflda

时间:2011-04-29 18:16:02

标签: c# .net il

我正在使用Mono.Cecil编写一个小型IL编织应用程序,这需要我在IL级别上操作目标程序集。

我的问题很简单,但我仍然觉得这件事很混乱。 ldfldldflda说明之间的实际区别是什么?

我已经咨询了msdn,看来当ldfld获取字段的值时,ldflda获取字段的地址。好的......但是这意味着什么?我首先想到的是前者用于值类型(和字符串),后者用于引用类型,但我编译了一个C#片段并在Reflector中检查它,这证明我错了。

当C#编译器发出ldflda而不是ldfld时,我无法找到任何明显的模式,而且我的搜索没有透露任何可以解释这一点的文章。那么何时使用ldflda代替ldfld

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:7)

我想它用于struct ures:

struct Counter
{
   public int i;
}

struct Something
{
   public Counter c;
}

Something s;
s.c.i++;

我很确定c这里是按地址加载的,否则会创建Counter的副本。这就是为什么你不能用propery做到这一点。

答案 1 :(得分:1)

如果将一个字段作为ref参数传递给子例程,您应该看到编译器为它发出一个ldflda,以获取传入的引用。