7

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

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

我咨询过msdn,似乎在ldfld获取字段的值时,ldflda获取了字段的地址。好吧……但这意味着什么?我一开始以为前者用于值类型(和字符串),后者用于引用类型,但我编译了一个 C# 片段并在 Reflector 中检查它,结果证明我错了。

ldflda当 C# 编译器发出而不是 时,我无法找到任何不同的模式ldfld,并且我的搜索没有发现任何可以解释这一点的文章。那么什么时候用ldflda代替ldfld呢?

任何帮助将不胜感激。

4

2 回答 2

7

我猜它用于structures:

struct Counter
{
   public int i;
}

struct Something
{
   public Counter c;
}

Something s;
s.c.i++;

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

于 2011-04-29T18:20:37.403 回答
1

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

于 2011-04-29T18:21:02.597 回答