Использование неподписанных примитивных типов - PullRequest
7 голосов
/ 29 августа 2008

В большинстве случаев мы представляем понятия, которые никогда не могут быть меньше 0. Например, чтобы объявить длину, мы пишем:

int length;

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

uint length; 

Некоторые недостатки, о которых я могу подумать:

  • неподписанные типы (uint, ulong, ushort) не совместимы с CLS, поэтому вы не можете использовать его с другими языками, которые не поддерживают это
  • .Net классы используют подписанные типы большую часть времени, поэтому вам нужно привести

Мысли

Ответы [ 6 ]

5 голосов
/ 29 августа 2008

«Когда в Риме, делай, как делают римляне».

Хотя теоретически есть преимущество в использовании неподписанных значений, где это применимо, потому что это делает код более выразительным, это просто не делается в C #. Я не уверен, почему разработчики изначально не проектировали интерфейсы для обработки uints и не соответствовали типу CLS, но теперь поезд покинул станцию.

Поскольку согласованность обычно важна, я бы посоветовал выбрать дорогу C # и использовать int s.

5 голосов
/ 29 августа 2008

Ваш второй пункт самый важный. Как правило, вы должны просто использовать int, так как это довольно хорошая «ловушка» для целочисленных значений. Я бы использовал uint, только если вам абсолютно необходима способность считать выше int, но без использования дополнительной памяти long требует (это не намного больше памяти, так что не стоит дешево :-p).

5 голосов
/ 29 августа 2008

Если вы уменьшите число со знаком до значения 0, оно станет отрицательным, и вы можете легко проверить это. Если вы уменьшите число без знака значением 0, оно опустится до минимума и станет максимальным значением для типа, что будет несколько сложнее проверить.

2 голосов
/ 29 августа 2008

Укажу, что в C # вы можете включить /checked для проверки арифметического переполнения / переполнения, что в любом случае неплохая идея. Если производительность важна в критическом разделе, вы все равно можете использовать unchecked, чтобы избежать этого.

Для внутреннего кода (т. Е. Кода, на который не будут ссылаться никакие помехи взаимодействия с другими языками), я голосую за использование unsigned, когда этого требует ситуация, например, переменных length, как упоминалось ранее. Это - наряду с проверенной арифметикой - предоставляет еще одну сеть для разработчиков, улавливая незначительные ошибки ранее.

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

2 голосов
/ 29 августа 2008

Я думаю, что тонкое использование uint и int приведет к путанице с разработчиками, если только это не записано в руководствах для разработчиков для компании.

Если длина, например, не может быть меньше нуля, то она должна быть четко выражена в бизнес-логике, чтобы будущие разработчики могли прочитать код и узнать истинное намерение.

Только мои 2 цента.

0 голосов
/ 29 августа 2008

Ваши две точки хороши. Тем не менее, основная причина избежать этого - кастинг. Кастинг делает их невероятно раздражающими в использовании. Я однажды пытался использовать неподписанные переменные, но мне приходилось разбрасывать приведение повсюду, потому что все методы каркаса используют целые числа со знаком. Поэтому всякий раз, когда вы вызываете метод фреймворка, вы должны приводить.

...