Почему Array.Length — это int, а не uint

Причин много:

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

int

c#

.net

int

uint

2022-08-25T03:54:06+00:00