Скажімо, маємо:
public void TestIndex1(int index)
{
if(index < 0 || index >= _size)
ThrowHelper.ThrowArgumentOutOfRangeException();
}
public void TestIndex2(int index)
{
if((uint)index >= (uint)_size)
ThrowHelper.ThrowArgumentOutOfRangeException();
}
Давайте скомпілюємо їх і подивимось на ILSpy:
.method public hidebysig
instance void TestIndex1 (
int32 index
) cil managed
{
IL_0000: ldarg.1
IL_0001: ldc.i4.0
IL_0002: blt.s IL_000d
IL_0004: ldarg.1
IL_0005: ldarg.0
IL_0006: ldfld int32 TempTest.TestClass::_size
IL_000b: bge.s IL_0012
IL_000d: call void TempTest.ThrowHelper::ThrowArgumentOutOfRangeException()
IL_0012: ret
}
.method public hidebysig
instance void TestIndex2 (
int32 index
) cil managed
{
IL_0000: ldarg.1
IL_0001: ldarg.0
IL_0002: ldfld int32 TempTest.TestClass::_size
IL_0007: blt.un.s IL_000e
IL_0009: call void TempTest.ThrowHelper::ThrowArgumentOutOfRangeException()
IL_000e: ret
}
Легко помітити, що другий має менше коду, з однією гілкою менше.
На насправді, немає кидка на все, що є вибір , використовувати чи blt.s
і bge.s
чи використанняblt.s.un
, де останній обробляє цілі числа , що передаються в якості знака в той час як колишні розглядає їх як підписані.
(Примітка для тих , хто не знайомий з КСС, так як це C # питання з КСС відповіді bge.s
, blt.s
і blt.s.un
є «короткі» версії bge
, blt
і blt.un
відповідно. blt
СОЗи два значення з стека і гілок , якщо перший менше , ніж другий , коли розглядаючи їх як підписані значення, покиblt.un
виводить два значення стека та гілок, якщо перше менше, ніж друге, коли розглядає їх як беззнакові значення).
Це абсолютно мікро-вибір, але бувають випадки, коли мікро-опції варто зробити. Далі розглянемо, що з рештою коду в тілі методу це може означати різницю між чимось, що потрапляє всередину межі тремтіння для вкладання чи ні, і якщо вони заважають мати помічника для викидання винятків за межі діапазону, вони ймовірно, намагається забезпечити вбудовування, якщо це можливо, і додаткові 4 байти можуть все змінити.
Дійсно, цілком імовірно, що ця вбудована різниця буде набагато більшою угодою, ніж скорочення однієї гілки. Існує не так багато випадків, коли виходити з усіх шляхів, щоб переконатися, що вбудовування відбувається, того варте, але основний метод класу такого інтенсивного використання, List<T>
який, безумовно, був би одним із них.