Должен ли я использовать Int или Int32
В C# int
а также Int32
это то же самое, но я прочитал несколько раз, что int
предпочтительнее Int32
без объяснения причин. Есть ли причина, и я должен заботиться?
35 ответов
ECMA-334: 2006 C# Language Specification (p18):
Каждый из предопределенных типов является сокращением для системного типа. Например, ключевое слово
int
относится к структуреSystem.Int32
, В качестве стиля использование ключевого слова предпочтительнее, чем использование полного имени типа системы.
Два действительно являются синонимами; int
будет немного более знакомым, Int32
делает 32-битность более явной для тех, кто читает ваш код. Я был бы склонен использовать int
где мне просто нужно "целое число", Int32
где важен размер (криптографический код, структуры), поэтому будущие сопровождающие будут знать, что безопасно увеличить int
если уместно, но следует позаботиться об изменении Int32
с таким же образом.
Результирующий код будет идентичен: разница только в удобочитаемости или внешнем виде кода.
Они оба объявляют 32-битные целые числа, и, как утверждали другие авторы, какой из них вы используете, в основном это вопрос синтаксического стиля. Однако они не всегда ведут себя одинаково. Например, компилятор C# не допустит этого:
public enum MyEnum : Int32
{
member1 = 0
}
но это позволит:
public enum MyEnum : int
{
member1 = 0
}
Пойди разберись.
Я всегда использую системные типы - например, Int32 вместо int. Я применил эту практику после прочтения Прикладного программирования на.NET Framework - автор Джеффри Рихтер хорошо обосновывает использование полных имен типов. Вот две вещи, которые застряли со мной:
Имена типов могут отличаться в разных языках.NET. Например, в C#,
long
сопоставляется с System.Int64 в C++ с управляемыми расширениями,long
сопоставляется с Int32. Поскольку языки могут смешиваться и сочетаться при использовании.NET, вы можете быть уверены, что использование явного имени класса всегда будет более понятным, независимо от предпочтительного языка читателя.Многие методы каркаса имеют имена типов как часть своих имен методов:
BinaryReader br = new BinaryReader( /* ... */ );
float val = br.ReadSingle(); // OK, but it looks a little odd...
Single val = br.ReadSingle(); // OK, and is easier to read
int является ключевым словом C# и является однозначным.
Большую часть времени это не имеет значения, кроме двух вещей, которые идут против Int32:
- Вы должны иметь "использование системы"; заявление. использование "int" не требует использования оператора.
- Можно определить свой собственный класс с именем Int32 (который был бы глупым и запутанным). int всегда означает int.
Как уже говорилось, int
знак равно Int32
, Чтобы быть в безопасности, обязательно всегда используйте int.MinValue
/int.MaxValue
при реализации всего, что заботится о границах типов данных. Предположим, что.NET решил, что int
теперь будет Int64
Ваш код будет меньше зависеть от границ.
Размер байта для типов не слишком интересен, когда вам приходится иметь дело только с одним языком (и для кода, который вам не нужно напоминать себе о математических переполнениях). Интересной становится часть, когда вы соединяете один язык с другим, C# с COM-объектом и т. Д., Или вы выполняете какое-то переключение битов или маскирование, и вам нужно напомнить себе (и вашим коллегам по пересмотру кода) размера данных.
На практике я обычно использую Int32 только для того, чтобы напомнить себе, какого они размера, потому что я пишу управляемый C++ (например, для соединения с C#), а также неуправляемый / нативный C++.
Как вы, наверное, знаете, в C# он 64-битный, но в нативном C++ он заканчивается как 32-битный, или char является unicode/16-битным, тогда как в C++ он 8-битный. Но откуда мы это знаем? Ответ таков, потому что мы посмотрели его в руководстве и сказали, что так.
Со временем и опытом вы начнете быть более добросовестным, когда будете писать коды для связи между C# и другими языками (некоторые читатели здесь думают: "Почему бы вам?"), Но, по-моему, это лучшая практика, потому что Я не могу вспомнить, что я кодировал на прошлой неделе (или мне не нужно указывать в своем документе API, что "этот параметр является 32-разрядным целым числом").
В F# (хотя я никогда не использовал его) они определяют int, int32 и nativeint. Тот же самый вопрос должен подняться: "Какой я использую?". Как уже упоминали другие, в большинстве случаев это не должно иметь значения (должно быть прозрачным). Но я бы, например, выбрал int32 и uint32, чтобы убрать неясности.
Я полагаю, что это будет зависеть от того, какие приложения вы кодируете, кто его использует, какие практики кодирования вы и ваша команда используете, и т. Д., Чтобы обосновать, когда использовать Int32.
Там нет никакой разницы между int
а также Int32
, но, как int
является ключевым словом языка, многие люди предпочитают его стилистически (так же, как и с string
против String
).
Я всегда использую псевдонимы типа (int, string и т. Д.) При определении переменной и реальное имя при доступе к статическому методу:
int x, y;
...
String.Format ("{0}x{1}", x, y);
Просто кажется уродливым видеть что-то вроде int.TryParse(). Нет другой причины, по которой я делаю это, кроме стиля.
По моему опыту это было условностью. Я не знаю ни одной технической причины использовать int поверх Int32, но это:
- Быстрее печатать.
- Более знакомый типичному разработчику C#.
- Другой цвет в подсветке синтаксиса Visual Studio по умолчанию.
Я особенно люблю этот последний.:)
Хотя они (в основном) идентичны (см. Ниже разницу между [ошибками]), вам определенно следует позаботиться и использовать Int32.
Имя для 16-разрядного целого числа - Int16. Для 64-разрядного целого числа это Int64, а для 32-разрядного целого числа интуитивно понятный выбор: int или Int32?
Вопрос о размере переменной типа Int16, Int32 или Int64 является самостоятельным, но вопрос о размере переменной типа int является вполне обоснованным вопросом, и вопросы, какими бы тривиальными они ни были, отвлекают, приводят путанице, тратить время, мешать обсуждению и т. д. (факт, что этот вопрос существует, подтверждает это).
Использование Int32 способствует тому, что разработчик осознает свой выбор типа. Насколько большой снова Int? Ах да, 32. Вероятность того, что размер шрифта будет фактически учтен, больше, когда размер включен в имя. Использование Int32 также способствует знанию других вариантов. Когда люди не вынуждены хотя бы признавать, что есть альтернативы, для int становится слишком легко стать "целочисленным типом".
Класс в рамках, предназначенный для взаимодействия с 32-разрядными целыми числами, называется Int32. Еще раз: более интуитивно понятный, менее запутанный, отсутствует (ненужный) перевод (не перевод в системе, а в сознании разработчика) и т. Д.
int lMax = Int32.MaxValue
или жеInt32 lMax = Int32.MaxValue
?int не является ключевым словом во всех языках.NET.
Хотя есть аргументы, почему он вряд ли когда-либо изменится, int не всегда может быть Int32.
Недостатками являются два дополнительных символа для ввода и [ошибка].
Это не скомпилируется
public enum MyEnum : Int32
{
AEnum = 0
}
Но это будет:
public enum MyEnum : int
{
AEnum = 0
}
Я знаю, что лучше всего использовать int, а весь код MSDN использует int. Однако нет никаких причин, кроме стандартизации и последовательности, насколько я знаю.
Тебя это не должно волновать. Вы должны использовать int
большую часть времени. Это поможет в будущем перенести вашу программу на более широкую архитектуру (в настоящее время int
псевдоним System.Int32
но это может измениться). Только когда битовая ширина переменной имеет значение (например, для управления макетом в памяти struct
) вы должны использовать int32
и другие (со связаннымиusing System;
").
Я бы порекомендовал использовать StyleCop от Microsoft.
Это как FxCop, но для вопросов, связанных со стилем. Конфигурация по умолчанию соответствует внутренним руководствам по стилю Microsoft, но ее можно настроить для вашего проекта.
Это может занять некоторое время, чтобы привыкнуть, но это определенно делает ваш код приятнее.
Вы можете включить его в процесс сборки, чтобы автоматически проверять наличие нарушений.
Когда-то тип данных int был привязан к размеру регистра машины, на которую нацелил компилятор. Так, например, компилятор для 16-битной системы будет использовать 16-битное целое число.
Тем не менее, мы, к счастью, больше не видим 16-битную версию, и когда 64-битная версия стала популярной, люди стали больше заботиться о том, чтобы сделать ее совместимой со старым программным обеспечением, а 32-битная была так долго, что для большинства компиляторов int просто предполагается, что это 32 бита.
int такой же, как System.Int32, и при компиляции он превращается в то же самое в CIL.
Мы используем int по соглашению в C#, так как C# хочет выглядеть как C и C++ (и Java), и это то, что мы используем там...
Кстати, я в конечном итоге использую System.Int32 при объявлении импорта различных функций Windows API. Я не уверен, является ли это определенным соглашением или нет, но это напоминает мне, что я иду на внешнюю DLL...
int является ярлыком языка C# для System.Int32
Хотя это действительно означает, что Microsoft может изменить это отображение, в посте обсуждений FogCreek говорится [источник]
"Что касается 64-битной проблемы - Microsoft действительно работает над 64-битной версией.NET Framework, но я уверен, что int НЕ будет отображаться на 64-битную в этой системе.
Причины:
1. Стандарт C# ECMA, в частности, гласит, что int 32-битный, а long 64-битный.
2. Microsoft ввела дополнительные свойства и методы в Framework версии 1.1, которые возвращают длинные значения вместо значений int, такие как Array.GetLongLength в дополнение к Array.GetLength.
Поэтому я думаю, что можно с уверенностью сказать, что все встроенные типы C# сохранят свое текущее отображение ".
На практике это не имеет значения, и со временем вы примете собственное соглашение. Я склонен использовать ключевое слово при назначении типа и версию класса при использовании статических методов и тому подобное:
int total = Int32.Parse ("1009");
Вы не должны заботиться. Если размер имеет значение, я бы использовал byte, short, int, затем long. Единственная причина, по которой вы используете int больше, чем int32, это если вам нужно число больше 2147483647 или меньше -2147483648.
Помимо этого мне было бы все равно, есть много других вопросов, которые могут быть обеспокоены.
Я использую int в том случае, если Microsoft изменяет реализацию по умолчанию для целого числа на какую-то новую версию с ошибками (назовем это Int32b).
Затем Microsoft может изменить псевдоним int на Int32b, и мне не нужно менять какой-либо мой код, чтобы воспользоваться их новой (и, надеюсь, улучшенной) целочисленной реализацией.
То же самое касается любого из ключевых слов типа.
int
это псевдоним для System.Int32
, как определено в этой таблице: Таблица встроенных типов (C# Reference)
Это не важно int - это ключевое слово языка, а Int32 - фактический тип системы.
Смотрите также мой ответ здесь на связанный вопрос.
Вы не должны заботиться о большинстве языков программирования, если только вам не нужно писать очень конкретные математические функции или код, оптимизированный для одной конкретной архитектуры... Просто убедитесь, что вам достаточно размера типа (используйте что-то большее, чем Int, если вы знаю, что вам нужно более 32-битных, например)
С использованием Int32
Для типа требуется ссылка на пространство имен System
или полностью соответствует (System.Int32
). Я склоняюсь к int
потому что он не требует импорта пространства имен, поэтому в некоторых случаях уменьшается вероятность конфликта пространства имен. При компиляции в IL нет никакой разницы между ними.
Также рассмотрим Int16. Если вам нужно хранить целое число в памяти в вашем приложении и вас беспокоит объем используемой памяти, то вы можете использовать Int16, поскольку он использует меньше памяти и имеет меньший минимальный / максимальный диапазон, чем Int32 (то есть, что такое int.)
Согласно непосредственному окну в Visual Studio 2012 Int32 - это int, Int64 - это длинный. Вот вывод:
sizeof(int)
4
sizeof(Int32)
4
sizeof(Int64)
8
Int32
int
base {System.ValueType}: System.ValueType
MaxValue: 2147483647
MinValue: -2147483648
Int64
long
base {System.ValueType}: System.ValueType
MaxValue: 9223372036854775807
MinValue: -9223372036854775808
int
int
base {System.ValueType}: System.ValueType
MaxValue: 2147483647
MinValue: -2147483648
Использование Int или Int32 - это то же самое, что просто упрощение кода для читателя.
Используйте Nullable вариант Int? или Int32? при работе с базами данных на полях, содержащих ноль. Это избавит вас от многих проблем во время выполнения.
Некоторые компиляторы имеют разные размеры для int на разных платформах (не специфично для C#)
Некоторые стандарты кодирования (MISRA C) требуют, чтобы все используемые типы имели заданный размер (т. Е. Int32, а не int).
Также полезно указывать префиксы для переменных разных типов (например, b для 8-битного байта, w для 16-битного слова и l для 32-битного длинного слова => Int32 lMyVariable)
Вы должны быть осторожны, потому что это делает ваш код более переносимым и более легким в обслуживании.
Переносимость может быть неприменима к C#, если вы всегда собираетесь использовать C# и спецификация C# никогда не изменится в этом отношении.
Поддерживаемое ihmo всегда будет применимо, потому что человек, обслуживающий ваш код, может не знать об этой конкретной спецификации C# и пропустить ошибку, если время от времени int становится больше 2147483647.
В простом цикле for, который подсчитывает, например, месяцы года, вас это не волнует, но когда вы используете переменную в контексте, где она может перетекать, вам следует позаботиться.
Вам также следует позаботиться о том, чтобы выполнять над ним побитовые операции.
Это 2021 год, и я прочитал все ответы. Большинство говорит, что это в основном то же самое (это псевдоним), или, это зависит от того, «что вам нравится», или «по соглашению использовать int...». Ни один ответ не дает вам четкого понимания, когда, где и зачем использовать over. Вот почему я здесь.
В 98% случаев вы можете уйти, и это прекрасно. Какие еще 2% ?
IO с записями (структура, собственные типы, организация и сжатие). Кто-то сказал, что бесполезное приложение - это приложение, которое может читать и обрабатывать данные, но на самом деле не способно записывать новые данные в определенное хранилище. Но чтобы не изобретать велосипед, в какой-то момент тем, кто имеет дело со старыми данными , необходимо найти документацию о том, как их читать. И скорее всего , они были составлены из эпохи , где
Это случалось раньше, когда некоторым было трудно вспомнить
В памяти , A
Где-то в 2028 году мальчик подумал, что он может просто уйти, нажав Ctrl-H-ing to, только целое слово и сопоставив регистр ... ~67000 изменений всего решения. Нажмите Run и все равно получите CTD. Хлопок хлопок хлопок. Пойдите и определите, на какие вы должны были поменять, а какие - на
Еще более фактическим примером является файл, содержащий обработку данных и соответствующие им команды (методы в исходном коде), такие как внутреннее ветвление (условное продолжение или переход в случае сбоя теста):
Проблема не во мне или в том, что вы пишете код сегодня , и нам кажется, что это нормально. Он находится на месте одного парня, который пытается понять, что мы написали 10 или 20 лет спустя, сколько времени (= денег) стоит придумать работающий обновленный код? Явные или повторяющиеся комментарии действительно сэкономят время. Какой из них ты предпочитаешь?
Кроме того, работа с внешними данными с других платформ или директивами компиляции - это концепция (сегодня это включает Interop, COM, PInvoke...), и от этой концепции мы не можем избавиться , независимо от эпохи, потому что для обновления (переформатирования) требуется время. datas(например, посредством сериализации). Обновление DLL до управляемого кода также требует времени. Нам потребовалось время, чтобы оставить ассемблер позади и перейти на полный C. Нам нужно время, чтобы перейти от 32-битных данных к 64-битным, но нам все еще нужно заботиться о 8 и 16 битах. Что дальше в будущем? Переходить со 128 бит на 256 или сразу на 1024? Не думайте, что ключевое слово, явное для вас, останется явным для парней, читающих вашу документацию 20 лет спустя (а документация обычно содержит ошибки, в основном из-за копирования / вставки).
Итак, вот оно: где сегодня использовать Int32 вместо int?
Это когда вы создаете код, учитывающий размер данных (ввод-вывод, сеть, кроссплатформенные данные ...), и в какой-то момент в будущем - может быть, спустя десятилетия - кому-то придется понимать и переносить ваш код. Основная причина - эпоха. 1000 строк кода, можно использовать
Не воспринимайте то, что я написал, как общее восприятие или попытку продвигать Int32 во всех случаях. Я четко изложил конкретный случай (поскольку мне кажется, что это было неясно из других ответов), чтобы защитить тех немногих, кого их руководители обвиняют в том, что они причудливые письма, и в то же время тот же самый руководитель не понимает, что нужно так долго, чтобы переписать эту C DLL на C#. Это крайний случай, но, по крайней мере, для тех, кто читает, "Int32" имеет по крайней мере одну цель в своей жизни.
Этот вопрос можно обсудить дальше, перевернув вопрос: почему бы просто не избавиться от