Почему Array.Length имеет тип int, а не uint

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

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

Итак, главный вопрос: есть ли польза от unsigned int ( uint )? Даже Microsoft, похоже, их не использует.

Ответов (5)

Решение

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

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

Фреймворк 1.1

Введение в библиотеку классов .NET Framework

Фреймворк 2.0

Обзор библиотеки классов .NET Framework

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

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

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

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

Похоже, никто не дал ответа на «главный вопрос».

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

Много причин:

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