Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IL:ldfld与ldflda_C#_.net_Il - Fatal编程技术网

C# IL:ldfld与ldflda

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时,我没有找到任何明显的模式

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

我的问题很简单,但我仍然觉得这件事很令人困惑。
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您是正确的。另见