Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

Что лучше использовать, uint или int в качестве аргумента функции, если значение должно быть >=0. Что использовать в качестве идентификатора?

#c_sharp #c++ #типы_данных #типы


В чужом коде на C# нигде не встречаю uint, ushort, ulong. Если требуется строго положительный
аргумент, то в начале функции обычно есть проверка с выбросом исключения, если аргумент
отрицательный. Хотя аргумент мог бы быть положительным, если бы в функциях использовали
uint.

Почему его не используют?

Почему не используют uint в качестве первичного ключа в таблице базы данных, если
идентификатор все равно положительный (ни в одном из проектов я не видел отрицательных
идентификаторов)?

Есть какая-то причина использовать обычный int вместо uint(unsigned int)?
    


Ответы

Ответ 1



Дело в том, что сборка, которая получается при компиляции, может быть использована другими языками, работающими на платформе .NET. В этих языках может и не быть беззнаковых целых чисел, и если публичные методы сборки содержат типы наподобие uint, вашу сборку невозможно будет использовать с такими языками. (Если сборка может работать со всеми языками под .NET, про неё говорят CLS-compliant.) Если вы пишете библиотеку для «всего мира», то использование её из экзотических языков — неплохая цель, поэтому такие библиотеки часто ограничены в использовании типов. Если же вы пишете код для себя, или не пишете библиотеку, то по идее можно использовать любой подходящий тип. Если вы хотите, чтобы ваша сборка была совместима с другими языками, проще всего дать ей атрибут [assembly: CLSCompliant(true)] (прописывается в любом файле, снаружи классов, например, в Assembly.cs), и компилятор сам предупредит о нарушениях. Подробная документация здесь.

Ответ 2



Многие базы данных (н.п. MSSQL) не поддерживают беззнаковые типы. Но использование целочисленных счётчиков в качестве первичного ключа - это в любом случае плохая идея, так как работает ровно до того момента, когда часть базы уезжает во внешнюю среду (другая база данных, файл, бэкап). После этого взаимодействие между этими компонентами ведёт к коллизиям, приходится заводить таблицы мапингов с соответствием номеров. Вместо этого в качестве уникального идентификатора записи лучше использовать GUID. Беззнаковые типы ты можешь использовать во внутреннем коде, но не стоит тащить эти значения в публичные интерфейсы. Их просто будет сложно интегрировать с прочим окружением. В .NET не принято использовать беззнаковые величины и ты не сможешь ни обратиться к элементу коллекции, ни прочитать несколько байт из потока без необходимости кастить твои беззнаковые значения к знаковым. Сами же разработчики оставляют отрицательные значения для всевозможных магических чисел и флагов. Например, Stream.ReadByte() возвращает не byte, а int, так как в случае неожиданного конца потока вернёт -1. Но в итоге всё сводится к тому, что это просто непринято, да и мир, стараниями Java, всё дальше уходит от беззнаковых типов.

Комментариев нет:

Отправить комментарий