C# 用于访问只读字段的MSIL代码将导致ldarg.0
我在C中有一个访问只读字段的简单方法: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将
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将此实例推送到计算堆栈