Использование без подписных примитивных типов

StackOverflow https://stackoverflow.com/questions/33852

  •  09-06-2019
  •  | 
  •  

Вопрос

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

int length;

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

uint length; 

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

  • Неподписанные типы (Uint, Ulong, Ushort) не соответствуют CLS, поэтому вы не можете использовать его с другими языками, которые не поддерживают это
  • .NET классы используют подписанные типы большую часть времени, поэтому вам придется разыграть

Мысли?

Это было полезно?

Решение

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

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

Поскольку согласованность в целом важна intс

Другие советы

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

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

Я думаю, что тонкое использование Uint против Int приведет к запуску с разработчиками, если оно не было записано в руководящие принципы разработчиков для компании.

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

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

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

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

Другой момент в дискуссии «Подписанный против без знака» состоит в том, что некоторые программисты используют значения, такие как -1, для указания ошибок, когда они иначе не имели бы значения. Я подписываюсь на представление о том, что у каждой переменной должна быть только одна цель, но если вы - или коллеги, с которыми вы кодируете - например, указать ошибки таким образом, оставляя подписанные переменные, дает вам гибкость, чтобы добавить состояния ошибки позже.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top