Подтвердить что ты не робот

Почему Count не является целым числом без знака?

Возможные дубликаты:
Почему .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?

4b9b3361

Ответ 2

Давайте посмотрим на это с практического угла.

К лучшему или худшему, подписанный 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?

Ответ 3

Mabye, потому что тип данных uint не является частью CLS (общая спецификация языка), поскольку не все языки .NET поддерживают его.

Вот очень похожий поток о массивах:

Почему Array.Length является int, а не uint

Ответ 4

  • Это не совместимо с CLS, в основном для обеспечения более широкой поддержки с разных языков.

  • Подписанный int позволяет легко переносить код с C или С++, который использует арифметику указателя.

  • Count может быть частью выражения, где общее значение может быть отрицательным. В частности, счетчик имеет прямую связь с индексами, где действительные индексы всегда находятся в диапазоне [0, Count-1], но используются отрицательные результаты, например. некоторыми методами двоичного поиска (в том числе предоставленными BCL), чтобы отразить позицию, в которой новый элемент должен быть вставлен для поддержания порядка.

Ответ 5

В vb.net нормальная циклическая конструкция (a "For/Next loop" ) будет выполнять цикл со значениями до и включая указанное максимальное значение, в отличие от C, которое может легко закоротить со значениями ниже верхнего предела. Таким образом, часто необходимо указать цикл, например. "Для я = 0 К Array.Length-1"; если Array.Length были неподписанными и нулевыми, это может вызвать очевидную проблему. Даже в C можно получить возможность сказать "для (i = Array.Length-1; я GE 0; -i)". Иногда мне кажется, что было бы полезно иметь 31-битный целочисленный тип, который бы поддерживал расширение приведений как для подписанного, так и для unsigned int, но я никогда не слышал о языке, поддерживающем такие.