Преобразование в int16, int32, int64 - как узнать, какой выбрать? - PullRequest
8 голосов
/ 07 ноября 2008

Мне часто приходится преобразовывать полученное значение (обычно в виде строки), а затем преобразовывать его в целое число. Но в C # (.Net) вы должны выбрать int16, int32 или int64 - как узнать, какой из них выбрать, если вы не знаете, насколько большим будет ваш восстановленный номер?

Ответы [ 6 ]

20 голосов
/ 07 ноября 2008

Каждый, кто упомянул, что объявление Int16 спасает овна, должен получить понижающее голосование.

Ответом на ваш вопрос является использование ключевого слова «int» (или, если вам так больше нравится, «Int32»).

Это дает вам диапазон до 2,4 миллиарда чисел ... Кроме того, 32-битные процессоры будут лучше обрабатывать эти целые числа ... также (и САМАЯ ВАЖНАЯ ПРИЧИНА ), если вы планируете использовать это int почти по любой причине ... скорее всего, это будет int (Int32).

В .Net Framework 99,999% числовых полей (которые являются целыми числами) являются "целыми числами" (Int32).

Пример: Array.Length, Process.ID, Windows.Width, Button.Height и т. Д., И т. Д., И т. Д., 1 млн. Раз.

РЕДАКТИРОВАТЬ: Я понимаю, что моя сварливость собирается поставить меня в тупик ... но это правильный ответ.

9 голосов
/ 07 ноября 2008

Просто хотел добавить это ... Я вспомнил, что во времена .NET 1.1 компилятор был оптимизирован таким образом, что операции 'int' на самом деле выполняются быстрее, чем операции с байтами или короткие операции. Я полагаю, что оно сохраняется и сегодня, но сейчас я провожу некоторые тесты.


РЕДАКТИРОВАТЬ: я получил неожиданное открытие: операции сложения, вычитания и умножения для коротких (s) фактически возвращают int!

3 голосов
/ 07 ноября 2008

Повторная попытка TryParse () не имеет смысла, у вас уже объявлено поле. Вы не можете изменить свое мнение, если не сделаете это поле типа Object. Не очень хорошая идея.

Какие бы данные ни были представлены в поле, они имеют физический смысл. Это возраст, размер, количество и т. Д. Физические величины имеют реальные ограничения по своему диапазону. Выберите тип int, который может хранить этот диапазон. Не пытайтесь исправить переполнение, это будет ошибка.

1 голос
/ 07 ноября 2008

Вопреки наиболее популярному в настоящее время ответу, более короткие целые числа (например, Int16 и SByte) часто занимают меньше места в памяти, чем большие целые числа (например, Int32 и Int64). Вы можете легко проверить это, создав большие массивы sbyte / short / int / long и используя perfmon для измерения размеров управляемой кучи. Это правда, что многие разновидности CLR расширяют эти целые числа для специфичных для ЦП оптимизаций при выполнении арифметических операций над ними и тому подобным, но при хранении как части объекта они занимают столько памяти, сколько необходимо.

Итак, вам определенно следует учитывать размер, особенно если вы будете работать с большим списком целых чисел (или с большим списком объектов, содержащих целочисленные поля). Вам также следует учитывать такие вещи, как CLS-совместимость (которая запрещает любые целые числа без знака в открытых членах).

Для простых случаев, таких как преобразование строки в целое число, я согласен, что Int32 (C # int) обычно имеет смысл и, вероятно, то, что ожидают другие программисты.

0 голосов
/ 07 ноября 2008

Все компьютеры конечны. Вам необходимо определить верхний предел на основе того, что, по вашему мнению, будут ваши требования к пользователям.

Если у вас действительно нет верхнего предела и вы хотите разрешить «неограниченные» значения, попробуйте добавить в ваш проект библиотеки времени выполнения .Net Java, что позволит вам использовать класс java.math.BigInteger, который выполняет математику почти целое число неограниченного размера.

Примечание. Java-библиотеки .Net поставляются с полной версией DevStudio, но я не думаю, что они поставляются с Express.

0 голосов
/ 07 ноября 2008

Если мы говорим только о паре цифр, выбор наибольшего не изменит вашего общего использования памяти, а просто сработает. Если вы говорите о множестве чисел, вам нужно использовать для них TryParse () и выяснить наименьший тип int для сохранения памяти.

...