我正在使用Mono.Cecil编写一个小型IL编织应用程序,这需要我在IL级别上操作目标程序集。
我的问题很简单,但我仍然觉得这件事很混乱。 ldfld
和ldflda
说明之间的实际区别是什么?
我已经咨询了msdn,看来当ldfld
获取字段的值时,ldflda
获取字段的地址。好的......但是这意味着什么?我首先想到的是前者用于值类型(和字符串),后者用于引用类型,但我编译了一个C#片段并在Reflector中检查它,这证明我错了。
当C#编译器发出ldflda
而不是ldfld
时,我无法找到任何明显的模式,而且我的搜索没有透露任何可以解释这一点的文章。那么何时使用ldflda
代替ldfld
?
非常感谢任何帮助。
答案 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,以获取传入的引用。