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

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

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

Итак, последний вопрос: есть ли смысл для беззнакового целого (uint)? Кажется, даже Microsoft не использует их.

Ответ 2

Множество причин:

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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