У меня есть этот код, который испускает некоторые инструкции IL
, вызывающие string.IndexOf
для null
объекта:
MethodBuilder methodBuilder = typeBuilder.DefineMethod(
"Foo",
MethodAttributes.Public,
typeof(void), Array.Empty<Type>());
var methodInfo = typeof(string).GetMethod("IndexOf", new[] {typeof(char)});
ILGenerator ilGenerator = methodBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldnull);
ilGenerator.Emit(OpCodes.Ldc_I4_S, 120);
ilGenerator.Emit(OpCodes.Call, methodInfo);
ilGenerator.Emit(OpCodes.Ret);
Это сгенерированный код IL
:
.method public instance int32 Foo() cil managed
{
// Code size 12 (0xc)
.maxstack 2
IL_0000: ldnull
IL_0001: ldc.i4.s 120
IL_0003: nop
IL_0004: nop
IL_0005: nop
IL_0006: call instance int32 [mscorlib]System.String::IndexOf(char)
IL_000b: ret
} // end of method MyDynamicType::Foo
Как вы видите, перед инструкцией call
есть три команды nop
.
Сначала я подумал о сборке Debug/Release, но это не сгенерированный компилятором код, я испускаю необработанный IL-код и ожидаю увидеть его как есть.
Так что мой вопрос, почему есть три nop
инструкции, когда я не излучаюсь каким - либо?