Я всегда встречаю код, который использует int
для таких вещей, как .Count
и т.д., даже в классах framework, вместо uint
.
В чем причина этого?
Я всегда встречаю код, который использует int
для таких вещей, как .Count
и т.д., даже в классах framework, вместо uint
.
В чем причина этого?
UInt32
не совместимый с CLS, поэтому он может быть недоступен на всех языках, ориентированных на Common Language Specification. Int32
является CLS-совместимым и, следовательно, гарантированно существует на всех языках.
int, в c, определенно определяется как целочисленный тип процессора по умолчанию и поэтому считается самым быстрым для общих числовых операций.
Другая причина использования int
:
Скажем, у вас есть for
-loop вот так:
for (i = someList.Count - 1; i >= 0; i--) {
// Stuff
}
очевидно, если бы someList.Count
был нулем, а unsigned
, у вас возникла бы проблема.
Если число действительно неподписанным по своему внутреннему характеру, я объявляю его неподписанным int. Однако, если я просто использую число (пока) в положительном диапазоне, то я бы назвал его int.
Основные причины:
Только несколько быстрых мыслей, которые приходят на ум.
Раньше я старался быть очень осторожным и выбирал правильную подпись без подписей, и я наконец понял, что это не дает положительного результата. Это просто создает дополнительную работу. Итак, зачем делать вещи сложными, смешивая и сопоставляя.
UInt32 не совместим с CLS. http://msdn.microsoft.com/en-us/library/system.uint32.aspx
Я думаю, что на протяжении многих лет люди пришли к выводам, что использование неподписанных типов на самом деле не дает такой выгоды. Лучший вопрос заключается в том, что вы получите, сделав Count UInt32?
Неподписанные типы ведут себя как целые числа, если сумма или произведение знака с подписью и без знака будет иметь тип подписанного типа, достаточно большой для хранения любого операнда, и если разница между двумя значениями без знака является значащим значением, достаточно большим, чтобы удерживать любые результат. Таким образом, код, который значительно использует UInt32
, часто должен вычислять значения как Int64
. Операции со знаком целочисленных типов могут не работать как целые числа, когда операнды слишком велики, но они будут вести себя разумно, когда операнды малы. Операции над непродвинутыми аргументами неподписанных типов создают проблемы, даже если операнды малы. Например, при UInt32 x;
неравенство x-1 < x
не будет выполнено для x==0
, если тип результата UInt32
, а неравенство x<=0 || x-1>=0
будет терпеть неудачу при больших значениях x
, если тип результата равен Int32
. Только если операция выполняется по типу Int64
, могут поддерживаться оба неравенства.
Хотя иногда полезно определять поведение беззнакового типа способами, которые отличаются от арифметики целого числа, значения, которые представляют такие вещи, как counts, обычно должны использовать типы, которые будут вести себя как целые числа - что-то неподписанные типы обычно не делают если они меньше основного целочисленного типа.
Некоторые вещи используют int, чтобы они могли возвращать -1, как если бы это было "null" или что-то в этом роде. Как ComboBox вернет -1 для него SelectedIndex, если у него нет выбранного элемента.
Некоторые старые библиотеки и даже InStr
используют отрицательные числа для обозначения особых случаев. Я считаю, что либо его лень, либо отрицательные особые значения.