Почему .NET Framework не использует неподписанные типы данных?
Возможный дубликат:
Почему Array.Length является int, а не uint
Есть ли причина, по которой .NET Framework не использует неподписанные типы данных?
Не следует ли использовать их в моем коде, но, например, свойство Count List < > является int. У вас нет отрицательного счета, так почему бы его не определить как uint? Должен ли я использовать только int, хотя я знаю, что счетчик не может быть отрицательным?
Ответы
Ответ 1
Неподписанные числовые типы не совместимы с CLS, поэтому они не должны использоваться ни для какого API, особенно для .NET framework.
В основном, CLS-совместимый код использует только те типы, которые доступны на всех языках .NET. Некоторые языки (например, VB.NET) не поддерживают беззнаковые числовые типы.
Ответ 2
Самый простой ответ заключается в том, что разработчики среды .NET предпочли иметь целые числа со знаком в библиотеке BCL (базовая библиотека классов) и CLS (общий язык синтаксиса), тогда как они не решили делать из него целые числа без знака.
Для обоснования этого решения, в конечном счете, вам придется обратиться к Microsoft. Я бы предположил, что Эрик Липперт мог перезвонить здесь с более подробным объяснением.
Это сводится к следующим фактам:
- Вы не можете (или, по крайней мере, нет) иметь неявное преобразование между
int
и uint
, что означает, что преобразования должны выполняться явно с использованием синтаксиса cast
- Лучше избегать ненужного синтаксиса кастинга, если он не добавляет читаемости кода
- Верхние границы
int
достаточны для большинства чисел, с которыми мы имеем дело в коде
Объединение этих элементов означает, что тип int
служит в большинстве случаев.
Ответ 3
Неподписанные номера не совместимы с CLS, потому что существуют языки, которые не поддерживают эти типы. Я говорю по исправлению, но VB.NET не поддерживает неподписанные типы. Это означает, что если вы объявляете открытый член как неподписанный тип, то ваша сборка не может использоваться с VB.NET или любого другого языка .NET, который не поддерживает неподписанные типы.
Ответ 4
Некоторые языки, поддерживающие .NET, позволяют использовать unsigned ints. Например. в С# вы можете использовать uint.
Однако, поскольку они не совместимы с CLS, если вы раскрываете их вне своей сборки, вы можете обнаружить, что другие разработчики, использующие другой язык, будут иметь проблемы с использованием ваших классов.
Итак, вкратце... Не стесняйтесь использовать их, но держите их в своих классах, используя либо частные, либо внутренние ключевые слова.