Ответ 1
Беззнаковое целое не является CLS-совместимым (Common Language Specification)
Для получения дополнительной информации о коде, совместимом с CLS, см. эту ссылку:
Возможные дубликаты:
Почему .NET использует int вместо uint в определенных классах?
Почему Array.Length является int, а не uint
Я всегда удивляюсь, почему .Count
не является целым без знака вместо подписанного?
Например, возьмите ListView.SelectedItems.Count
. Число элементов не может быть меньше 0, поэтому почему это подписанный int?
Если я попытаюсь проверить, есть ли выбранные элементы, я бы хотел протестировать
if (ListView.SelectedItems.Count == 0) {}
но поскольку это целое число со знаком, мне нужно проверить
if (ListView.SelectedItems.Count <= 0) {}
или есть ли когда-либо, когда .Count
может быть < 0?
Беззнаковое целое не является CLS-совместимым (Common Language Specification)
Для получения дополнительной информации о коде, совместимом с CLS, см. эту ссылку:
Давайте посмотрим на это с практического угла.
К лучшему или худшему, подписанный int
- это обычный тип int
, используемый в .NET. Также было нормально использовать подписанные int
в C и С++. Таким образом, большинство переменных объявляются как int
, а не без знака int
, если в этом нет веской причины.
Преобразование между unsigned int
и подписанным int
имеет проблемы и не всегда безопасно.
В 32-битной системе коллекция не может содержать около 2 ^^ 32 элементов, , поэтому подписанный int
достаточно велик во всех случаях.. p >
В 64-битной системе неподписанный int
вам не много, а в большинстве случаев подписанный int
по-прежнему достаточно велик, иначе вам нужно использовать 64-битный int
. (Я ожидаю, что ни одна стандартная коллекция не будет хорошо справляться с любыми объектами около 2 ^^ 31 в системе 64!)
Поэтому, учитывая, что использование unsigned int
не имеет явного преимущества, почему вы используете unsigned int
?
Mabye, потому что тип данных uint не является частью CLS (общая спецификация языка), поскольку не все языки .NET поддерживают его.
Вот очень похожий поток о массивах:
Это не совместимо с CLS, в основном для обеспечения более широкой поддержки с разных языков.
Подписанный int позволяет легко переносить код с C или С++, который использует арифметику указателя.
Count может быть частью выражения, где общее значение может быть отрицательным. В частности, счетчик имеет прямую связь с индексами, где действительные индексы всегда находятся в диапазоне [0, Count-1], но используются отрицательные результаты, например. некоторыми методами двоичного поиска (в том числе предоставленными BCL), чтобы отразить позицию, в которой новый элемент должен быть вставлен для поддержания порядка.
В vb.net нормальная циклическая конструкция (a "For/Next loop" ) будет выполнять цикл со значениями до и включая указанное максимальное значение, в отличие от C, которое может легко закоротить со значениями ниже верхнего предела. Таким образом, часто необходимо указать цикл, например. "Для я = 0 К Array.Length-1"; если Array.Length были неподписанными и нулевыми, это может вызвать очевидную проблему. Даже в C можно получить возможность сказать "для (i = Array.Length-1; я GE 0; -i)". Иногда мне кажется, что было бы полезно иметь 31-битный целочисленный тип, который бы поддерживал расширение приведений как для подписанного, так и для unsigned int, но я никогда не слышал о языке, поддерживающем такие.