C# IL:ldfld与ldflda
我正在使用Mono.Cecil编写一个小的IL编织应用程序,这需要我在IL级别上操作目标程序集 我的问题很简单,但我仍然觉得这件事很令人困惑。C# IL:ldfld与ldflda,c#,.net,il,C#,.net,Il,我正在使用Mono.Cecil编写一个小的IL编织应用程序,这需要我在IL级别上操作目标程序集 我的问题很简单,但我仍然觉得这件事很令人困惑。ldfld和ldflda指令之间的实际区别是什么 我咨询了msdn,发现ldfld获取字段的值时,ldflda获取字段的地址。可以但这意味着什么?我最初认为前者用于值类型(和字符串),后者用于引用类型,但我编译了一个C#snippet并在Reflector中进行了检查,结果证明我错了 当C#编译器发出ldflda而不是ldfld时,我没有找到任何明显的模式
ldfld
和ldflda
指令之间的实际区别是什么
我咨询了msdn,发现ldfld
获取字段的值时,ldflda
获取字段的地址。可以但这意味着什么?我最初认为前者用于值类型(和字符串),后者用于引用类型,但我编译了一个C#snippet并在Reflector中进行了检查,结果证明我错了
当C#编译器发出ldflda
而不是ldfld
时,我没有找到任何明显的模式,我的搜索也没有发现任何文章可以解释这一点。那么什么时候使用ldflda
而不是ldfld
非常感谢您的帮助。我想它是用于
结构的:
struct Counter
{
public int i;
}
struct Something
{
public Counter c;
}
Something s;
s.c.i++;
我很确定这里的c
是按地址加载的,否则它将创建计数器的副本。这就是为什么不能使用propery执行此操作。如果您将字段作为ref参数传递给子例程,您应该看到编译器为其发出ldflda,以便获得要传入的引用。根据您的描述,我怀疑它使用ldflda,如果它需要将变量传递到ref参数中,请对其调用一个方法,或分配给它。+1您是正确的。另见