En IL compilé, il n'y a pas de libellé. Au lieu de cela, les instructions de saut utilisent des décalages relatifs à partir du début de l'instruction suivante.
Par exemple, considérons cette fonction trivial C#:
public static bool IsZero(int n)
{
if (n == 0)
return true;
return false;
}
Dans IL, vous pourriez écrire comme ceci:
.method public hidebysig static bool IsZero(int32 n) cil managed
{
ldarg.0
brtrue.s label
ldc.i4.1
ret
label:
ldc.i4.0
ret
}
Si vous compilez que l'utilisation ilasm puis décompiler arrière à l'aide ildasm , avec "Afficher les octets" activé, vous obtenez:
.method public hidebysig static bool IsZero(int32 n) cil managed
// SIG: 00 01 02 08
{
// Method begins at RVA 0x2052
// Code size 7 (0x7)
.maxstack 8
IL_0000: /* 02 | */ ldarg.0
IL_0001: /* 2D | 02 */ brtrue.s IL_0005
IL_0003: /* 17 | */ ldc.i4.1
IL_0004: /* 2A | */ ret
IL_0005: /* 16 | */ ldc.i4.0
IL_0006: /* 2A | */ ret
} // end of method Program::IsZero
Notez que les étiquettes ne sont pas dans n'importe quel moyen représenté dans les octets (montré dans les commentaires). Et que brtrue.s label
de l'IL d'origine est ici représenté brtrue.s IL_0005
, où les octets sont 2D 02
. 2D
est la forme compilée de brtrue.s
et 02
est un décalage relatif. Puisque l'instruction suivante commence au décalage absolu 3, la cible est au décalage absolu 3 + 2 = 5.
Qu'est-ce qui vous fait penser que c'est une étiquette, plutôt que la façon dont il affiche la IL? –
donc c'est comme la ligne "IL_0001"? @JonSkeet –
@EhsanSajjad: Sorte de. Je crois qu'ils agissent comme des étiquettes que vous * pouvez * utiliser dans IL, mais je ne crois pas qu'ils sont dans le code généré. –