Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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# 用于访问只读字段的MSIL代码将导致ldarg.0_C#_.net_Cil - Fatal编程技术网

C# 用于访问只读字段的MSIL代码将导致ldarg.0

C# 用于访问只读字段的MSIL代码将导致ldarg.0,c#,.net,cil,C#,.net,Cil,我在C中有一个访问只读字段的简单方法: IL_0024: ldarg.0 IL_0025: ldfld string MyAssembly.MyClass.TestClass::A 我的自然假设是,这用于在访问成员字段时加载this引用,这个问题也证实了: 但是,的文档提到它用于加载传递给该方法的参数 这种行为的正确解释是什么?如何区分加载此引用和将第一个形式参数加载到IL中的方法?两者都是正确的: this值作为第一个不可见参数传递给实例方法,因此在实例方法中,ldarg.0将

我在C中有一个访问只读字段的简单方法:

IL_0024:  ldarg.0
IL_0025:  ldfld      string MyAssembly.MyClass.TestClass::A
我的自然假设是,这用于在访问成员字段时加载this引用,这个问题也证实了:

但是,的文档提到它用于加载传递给该方法的参数

这种行为的正确解释是什么?如何区分加载此引用和将第一个形式参数加载到IL中的方法?

两者都是正确的:

this值作为第一个不可见参数传递给实例方法,因此在实例方法中,ldarg.0将加载this值

如果编写一个使用不同参数的方法,则可以看到差异。例如:

static void StaticMethod(int x)
{
    // This uses ldarg.0
    Console.WriteLine(x);
}

void InstanceMethod(int x)
{
    // This uses ldarg.1
    Console.WriteLine(x);
}
如何区分加载这个引用和加载第一个形式参数到IL中的方法

通过检查以上内容,基本上-如果是实例方法,那么ldarg.0将加载隐式this值。否则,它将加载第一个形式参数值。

两者都正确:

this值作为第一个不可见参数传递给实例方法,因此在实例方法中,ldarg.0将加载this值

如果编写一个使用不同参数的方法,则可以看到差异。例如:

static void StaticMethod(int x)
{
    // This uses ldarg.0
    Console.WriteLine(x);
}

void InstanceMethod(int x)
{
    // This uses ldarg.1
    Console.WriteLine(x);
}
如何区分加载这个引用和加载第一个形式参数到IL中的方法


通过检查以上内容,基本上-如果是实例方法,那么ldarg.0将加载隐式this值。否则,它将加载第一个形式参数值。

所有实例方法都将第一个参数作为类实例本身。这是隐式完成的,因此在调用方法时不必传递它


假设这是一个方法参数,您需要使用ldarg.0将此实例推送到计算堆栈。

所有实例方法都将第一个参数作为类实例本身。这是隐式完成的,因此在调用方法时不必传递它

假设这是一个方法参数,则需要使用ldarg.0将此实例推送到计算堆栈