Почему 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] для людей было бы загадочно иметь возможность генерировать положительные, но незаконные длины массива.
- Примечание. что это ограничение было несколько удалены в версии 4.5, хотя стандартная длина как int остается.
- исторически C# наследует большую часть своего синтаксиса и соглашения от C и c++. В этих массивах просто арифметика указателя, поэтому индексирование отрицательного массива было возможно (хотя обычно незаконно и опасно). Поскольку существующий код предполагает, что индекс массива подписан, это было бы фактором
- на соответствующем примечании использование знаковых целых чисел для индексов массива в C / C++ означает, что взаимодействие с этими языками и неуправляемыми функциями потребует использования ints в этих обстоятельствах в любом случае, что может запутать из-за несогласованности.
- реализация BinarySearch (очень полезный компонент многих алгоритмов) полагается на возможность использовать отрицательный диапазон int, чтобы указать, что значение не было найдено и место, в котором такое значение должно быть вставлено для поддержания рассортировать.
- при работе с массивом, вероятно, вы захотите взять отрицательное смещение существующего индекса. Если вы использовали смещение, которое приведет вас к началу массива с помощью unit, то поведение обертки сделает ваш индекс, возможно, законным (в том, что он положительный). С int результат будет незаконным (но безопасным, поскольку среда выполнения будет защищать от чтения недопустимой памяти)
Я думаю, что это также может быть связано с упрощением вещей на более низком уровне, начиная с Array.Длина, конечно, будет добавлена к отрицательному числу в какой-то момент, если массив.Длина была без знака и добавлена к отрицательному int (дополнение двух), могут быть грязные результаты.
похоже, никто не дал ответа на"окончательный вопрос".
Я считаю, что основное использование беззнаковых ints - это обеспечение более легкого взаимодействия с внешними системами (P/Invoke и т. д.) и покрытие потребностей различных языков, на которые переносится .Сеть.
обычно целочисленные значения подписываются, если явно не требуется значение без знака. Просто так их используют. Я могу не согласиться с этим выбором, но так оно и есть.
в настоящее время, с сегодняшними типичными ограничениями памяти, если вашему массиву или подобной структуре данных нужна длина UInt32, вы должны рассмотреть другие структуры данных.
с массивом байтов Int32 даст вам 2 ГБ значений