Dla celów edukacyjnych uczę się trochę IL (głównie dlatego, że byłem ciekawy, co dzieje się z "%" pod maską (która okazuje się być rem) i zaczęło dygresja ...).Dlaczego w tym przypadku używany jest kod opcyjny "br.s" IL?
pisałem sposób, po prostu wraca prawdziwy złamać rzeczy nieco w dół i zastanawiałem się o opcode „br s”:
.method public hidebysig static bool ReturnTrue() cil managed
{
// Code size 7 (0x7)
.maxstack 1
.locals init ([0] bool CS$1$0000)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: br.s IL_0005
IL_0005: ldloc.0
IL_0006: ret
} // End of method Primes::ReturnTrue
Po ldc.i4.1 wypycha 1 na stosie i stloc .0 umieszcza to w 0. lokalnym, br.s zasadniczo (o ile wiem) robi "goto" do ldloc.0 na linii IL_0005.
Dlaczego tak jest? Dlaczego po prostu nie ma linii IL_0004, więc można ją pominąć?
Nie ma IL_0004, ponieważ 'br.s' jest dwubajtową instrukcją. Zgaduję, że wyłączyłeś optymalizacje? Tak, oczekuj dziwnych rzeczy. Co otrzymasz po włączeniu optymalizacji? – hvd
Następnie po prostu popycha "1" do stosu i natychmiast wraca. IL_0000: ldc.i4.1 IL_0001: ret – Apeiron
W "IL_xxxx" xxxx jest przesunięciem instrukcji w bajtach od początku metody. br.s jest instrukcją jednobajtową (tak jak reszta), która pobiera operand jednobajtowy, do którego jest skierowana instrukcja docelowa. –