Почему Array.Длина int, а не uint [дубликат]

этот вопрос уже есть ответ здесь:

почему Array.Length int, а не uint. Это беспокоит меня (немного), потому что значение длины никогда не может быть отрицательным.

Это заставило меня использовать int для length-свойство моего собственного класса, потому что когда вы укажите целое значение, это должно быть явно приведен...

таким образом, окончательный вопрос: есть ли какое-либо использование для unsigned int (uint)? Даже Microsoft, похоже, не использует их.

5 ответов


Unsigned int не соответствует CLS и поэтому ограничивает использование свойства теми языками, которые реализуют UInt.

смотрите здесь:

Framework 1.1

введение .Библиотека классов

Framework 2.0

.Библиотека классов обзор


многим причинам:

  • uint не совместим с CLS, поэтому сделать встроенный тип (массив) зависимым от него было бы проблематично
  • первоначально разработанная среда выполнения запрещает любой объект в куче, занимающий более 2 ГБ памяти. Поскольку максимальный размер массива, который будет меньше или равен этому пределу, будет новым байтом[int.MaxValue] для людей было бы загадочно иметь возможность генерировать положительные, но незаконные длины массива.
  • исторически C# наследует большую часть своего синтаксиса и соглашения от C и c++. В этих массивах просто арифметика указателя, поэтому индексирование отрицательного массива было возможно (хотя обычно незаконно и опасно). Поскольку существующий код предполагает, что индекс массива подписан, это было бы фактором
  • на соответствующем примечании использование знаковых целых чисел для индексов массива в C / C++ означает, что взаимодействие с этими языками и неуправляемыми функциями потребует использования ints в этих обстоятельствах в любом случае, что может запутать из-за несогласованности.
  • реализация BinarySearch (очень полезный компонент многих алгоритмов) полагается на возможность использовать отрицательный диапазон int, чтобы указать, что значение не было найдено и место, в котором такое значение должно быть вставлено для поддержания рассортировать.
  • при работе с массивом, вероятно, вы захотите взять отрицательное смещение существующего индекса. Если вы использовали смещение, которое приведет вас к началу массива с помощью unit, то поведение обертки сделает ваш индекс, возможно, законным (в том, что он положительный). С int результат будет незаконным (но безопасным, поскольку среда выполнения будет защищать от чтения недопустимой памяти)

Я думаю, что это также может быть связано с упрощением вещей на более низком уровне, начиная с Array.Длина, конечно, будет добавлена к отрицательному числу в какой-то момент, если массив.Длина была без знака и добавлена к отрицательному int (дополнение двух), могут быть грязные результаты.


похоже, никто не дал ответа на"окончательный вопрос".

Я считаю, что основное использование беззнаковых ints - это обеспечение более легкого взаимодействия с внешними системами (P/Invoke и т. д.) и покрытие потребностей различных языков, на которые переносится .Сеть.


обычно целочисленные значения подписываются, если явно не требуется значение без знака. Просто так их используют. Я могу не согласиться с этим выбором, но так оно и есть.

в настоящее время, с сегодняшними типичными ограничениями памяти, если вашему массиву или подобной структуре данных нужна длина UInt32, вы должны рассмотреть другие структуры данных.

с массивом байтов Int32 даст вам 2 ГБ значений