Я некоторое время наблюдал, что программисты на C# имеют тенденцию использовать int везде и редко прибегают к uint. Но я почему-то не нашел удовлетворительного ответа.using uint vs int
Если интероперабельность - это ваша цель, uint не должен появляться в публичных API-интерфейсах, потому что не все языки CLI поддерживают целые числа без знака. Но это не объясняет, почему int настолько распространен, даже во внутренних классах. Я подозреваю, что это причина, по которой uint используется экономно в BCL.
В C++, если у вас есть целое число, для которого отрицательные значения не имеют смысла, вы выбираете целое число без знака.
Это явно означает, что отрицательные числа недопустимы или ожидаются, и компилятор проведет вас для проверки. Я также подозреваю в случае индексов массива, что JIT может легко отбросить проверку нижних границ.
Однако при смешивании типов типа int и устройства потребуется дополнительная осторожность и отливка.
Следует ли использовать больше? Зачем?
http://stackoverflow.com/questions/6301/why-is-array-length-an-int-and-not-an-uint – drharris
Только что у меня была дежа вю: D, почти точно такой же вопрос было предложено короткое время назад. – KroaX
Что касается проверок нижних границ (если вам нужно написать свои собственные), вы можете заменить 'if (i < 0 || i > = length)' на 'if (unchecked ((uint) i)> = length)'. Результат IL будет иметь одну (ветвь) инструкцию меньше всего и даст примерно такую же производительность (бесконечно быстрее). Лично я люблю это просто потому, что он царапает мой зуд от проверки нижних границ. Другие, вероятно, возражают против этого из-за «непроверенных», но я утверждаю, что это очень хорошая линия для изучения его смысла, потому что это просто и сразу ясно из контекста, что цель - помогает читателю учиться. – AnorZaken