Чи варто використовувати int або Int32


352

У C # intі Int32те ж саме, але я читав кілька разів, який intвіддають перевагу, Int32без причини. Чи є причина, і я повинен дбати?


Твіт від Скета про це, коли він надає перевагу Int32 над Int при програмуванні API.
comecme

@JohnBubriski: і не будемо забувати, що для його використання потрібно менше заяв (або ви набираєте System.Int32)
sehe

у мене питання: ми не використовуємо безпосередньо тип CLR, але навіщо вони нам потрібні ??
AminM

@JohnBubriski Оновлення статусу у Facebook простіше набрати, ніж фрагмент коду. Погане мислення там! Простіше читати та розуміти - це набагато важливіше, ніж легше набирати текст. When something can be read without effort, great effort has gone into its writing. Easy writing is hard reading
7hi4g0

Відповіді:


134

ECMA-334 : 2006 Специфікація мови C # (p18):

Кожен з попередньо визначених типів є скороченням для системного типу. Наприклад, ключове слово intвідноситься до структура System.Int32. Що стосується стилю, то використання ключового слова надає перевагу використанню повного імені типу системи.


271

Два справді є синонімами; intбуде трохи більш звичним виглядом, Int32робить 32-розрядніші більш явними для тих, хто читає ваш код. Я був би схильний використовувати intтам, де мені просто потрібне "ціле число", Int32де важливий розмір (криптографічний код, структури), тому майбутні технічні працівники будуть знати, що це безпечно збільшити, intякщо потрібно, але слід подбати про зміну Int32s таким же чином.

Отриманий код буде ідентичним: різниця полягає лише у читанні чи появі коду.


65
Люди, які читають ваш код, повинні знати, що Int - псевдонім для System.Int32. Що стосується читабельності, послідовність набагато важливіша.
Тролі Томсена

11
Для тих, хто має старий настрій C ++, IntPtr розрахований на 32 біти на 32-бітній ОС та 64 біт на 64-бітній ОС. Така поведінка конкретно згадується у своєму підсумковому тезі. msdn.microsoft.com/en-us/library/system.intptr(VS.71).aspx
діадема

87

Вони обидва оголошують 32-бітові цілі числа, і як було зазначено в інших плакатах, який з них ви використовуєте - це переважно питання синтаксичного стилю. Однак вони не завжди поводяться однаково. Наприклад, компілятор C # не дозволить цього:

public enum MyEnum : Int32
{
    member1 = 0
}

але це дозволить:

public enum MyEnum : int
{
    member1 = 0
}

Піди розберися.


9
Якщо ви використовуєте Reflector для вивчення типу System.Int32, ви виявите, що це структура, а не клас. Код виглядає приблизно так: [Serializable, StructLayout (LayoutKind.Sequences), ComVisible (true)] public structure Int32: IComparable, IFormattable, IConvertible, IComparable <int>, IEquatable <int> {public const int MaxValue = 0x7fffffff; ... Ви не можете отримати тип із структури. Принаймні, ви отримаєте помилку, яка вам так говорить. Однак поведінка перерахунків дещо інша, про що я буду коментувати далі.
raddevus

16
Неможливість отримати перерахунок із Int32 - це розроблена поведінка, яку також можна побачити, переглянувши код .NET: [Serializable, ComVisible (true)] публічний абстрактний клас Enum: ValueType, IComparable, IFormattable, Зауважте, що Enum похідний від ValueType? Якщо ви спробуєте отримати перерахунок із чогось іншого, окрім внутрішнього типу даних (int, байт тощо), ви отримаєте помилку, яка виглядає як: Введіть байт, sbyte, short, ushort, int, uint, long або ulong очікуваний .
raddevus

2
@daylight зверніть увагу, що вказівка enumна використання intне є derive, а вказує an underlying type; див. msdn.microsoft.com/en-us/library/sbbt4032.aspx#code-snippet-2
Jeroen Wiert Pluimers

2
@JeroenWiertPluimers Однак все ще цікаво, чому вони вирішили дослівно перевірити базовий тип і кинути CS1008 , оскільки базовий тип є лише типом констант в перерахунку, тому при компіляції це не має особливого значення.
IllidanS4 хоче, щоб Моніка повернулася

5
@ IllidanS4, з новим компілятором Roslyn - це було виправлено, і обидва варіанти дійсні
Grundy

49

Я завжди використовую типи системи - наприклад, Int32замість int. Я застосував цю практику після прочитання Applied .NET Framework Programming - автор Джеффрі Ріхтер робить хороший приклад для використання імен повного типу. Ось два моменти, які зіткнулися зі мною:

  1. Назви типів можуть відрізнятися між мовами .NET. Наприклад, в C #, longкарта в System.Int64, а в C ++ з керованими розширеннями, longкарта в Int32. Оскільки мови можна змішувати і співставляти під час використання .NET, ви можете бути впевнені, що використання явного імені класу завжди буде зрозумілішим, незалежно від бажаної мови читача.

  2. У багатьох методах фреймворку є назви типів як частини назв методів:

    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

Проблема з цим полягає в тому, що автоматичне завершення програми Visual Studio все ще використовує int. Тож якщо ви зробите List<Tuple<Int32, Boolean>> test = new, Visual Studio тепер вставлятиме List<Tuple<int, bool>>(). Чи знаєте ви про спосіб змінити ці автозавершення?
MrFox

2
Так, це питання; ні, я не знаю, як їх змінити назовні. Точка №2 вже не є проблемою для мене, тому що я, як правило, використовую varякнайбільше, щоб зменшити стислість коду. У тих місцях, де автозаповнення заходить і плює на мою підлогу, я налаштовуюсь вручну - це буквально секунда-дві мого часу.
Ремі Деспрес-Сміт

20

int - це ключове слово C # і є однозначним.

Більшість випадків це не має значення, а дві речі, які йдуть проти Int32:

  • Потрібно мати систему, що використовує систему; заява. використання "int" не вимагає використання оператора.
  • Можна визначити власний клас під назвою Int32 (що було б дурно і заплутано). int завжди означає int.

Можна також створити свій власний клас 'var', але це не заважає людям використовувати його.
Нема

Кожне ключове слово є ключовим словом C #. int вже використовувався в C і C ++. Тому нічого конкретно на C # немає.
MrFox

12

Як вже було сказано, int= Int32. Щоб бути безпечним, обов'язково використовуйте int.MinValue/ int.MaxValueпри впровадженні будь-чого, що стосується меж типу даних. Припустимо. NET вирішив, що intтепер це буде Int64, ваш код буде менш залежним від меж.


8
@spoulson: Помилка коментарів у рядку 1: Призначення заборонено між рівними типами. Так, поганий жарт.
Йоганн Герелл

22
Якщо специфікація C # (це рішення C #, а не .NET) коли-небудь вирішила змінити, щоб зробити int64 біт, це було б настільки переломною зміною, що я не вважаю, що можливо (або, безумовно, розумно) кодувати оборонно проти таких випадків.
Джон Скіт

9

Розмір байтів для типів не надто цікавий, коли вам доводиться мати справу лише з однією мовою (і для коду, який вам не потрібно нагадувати про переповнення математики). Частина, яка стає цікавою, - це коли ви переходите між однією мовою на іншу, об'єктом 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.


Це не скасовує призначення .net? Що таке F # у будь-якому випадку, ідея, яку у Гейтса пішов з виходом на пенсію ...
Нік Тернер

8

Немає різниці між intі Int32, але як intце мовне ключове слово, багато людей вважають за краще його стилістично (так само, як і stringпроти vs String).


7

На мій досвід, це була умовна річ. Мені невідома будь-яка технічна причина використання int через Int32, але це:

  1. Швидше набрати.
  2. Більш знайомий типовому розробнику C #.
  3. Інший колір у підсвічуванні синтаксису візуальної студії за замовчуванням.

Мені особливо подобається той останній. :)


7

Я завжди використовую псевдонімні типи (int, string тощо), коли визначаю змінну і використовую справжнє ім'я під час доступу до статичного методу:

int x, y;
...
String.Format ("{0}x{1}", x, y);

Просто здається некрасивим бачити щось на зразок int.TryParse (). Немає іншої причини, що я роблю це, крім стилю.


5

Я знаю, що найкращим методом є використання int, а всі MSDN-коди використовують int. Однак, наскільки я знаю, немає причини, що виходить поза стандартизацією та послідовністю.


5

Хоча вони (здебільшого) однакові (див. Нижче про одну [помилку] різницю), вам, безумовно, слід подбати, і ви повинні використовувати Int32.

  • Назва для 16-бітного цілого числа - Int16. Для 64-бітного цілого числа це Int64, а для 32-бітного цілого числа інтуїтивно зрозумілим вибором є: int чи Int32?

  • Питання про розмір змінної типу Int16, Int32 або Int64 є самостійним посиланням, але питання про розмір змінної типу int є цілком правильним питанням, і питання, які б тривіальні, не відволікають, ведуть до плутанини, марно витрачати час, перешкоджати обговоренню тощо (факт, що існує в цьому питанні, доводить суть).

  • Використання Int32 сприяє тому, що розробник усвідомлює свій вибір типу. Наскільки знову великий інт? О так, 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
}

Ви кажете "Ім'я для 16-бітного цілого числа - це Int16, для 64-бітного цілого числа - це Int64, а для 32-бітного цілого числа інтуїтивно зрозумілим вибором є: int або Int32?", Але для них є також ключові слова C #. Int16 = короткий Int64 = довгий Отже, точка однієї Вашої відповіді базується на неправильному припущенні.
Мел

"змінна типу int - цілком коректне питання, і питання, якими б тривіальними не відволікали, призводять до плутанини, марнують час, перешкоджають обговоренню тощо". Ти мене жартуєш? Ви працюєте мовою, що не до кінця розумієте, що стоїть за капотом. Якщо розробник не розуміє, що прирівняє примітивний тип, він повинен зайнятися кулінарним мистецтвом. Здається, що розробник VB. використання примітивів є рідною для будь-якої мови і слід віддавати перевагу. Це добре, якщо ви не любите примітивів, але не складаєте реалій.
Нік Тернер

Хм, я абсолютно не погоджуюся з вашою думкою, що мені слід дбати ... але я не знав, що переліки можуть успадковувати лише ключові слова. Досить марний факт, але все ж цікаво дізнатися :)
Jowen

4

Вам не варто байдуже. Ви повинні використовувати intбільшу частину часу. Це допоможе перенести вашу програму в більш широку архітектуру в майбутньому (наразі intце псевдонім, System.Int32але це може змінитися). Тільки тоді, коли має значення ширина біта змінної (наприклад: для управління компонуванням в пам'яті a struct), ви повинні використовувати int32та інші (із пов'язаним " using System;").


1
Ви не можете бути серйозними ... полегшити перенесення? Я не думаю, що пошук і заміна - це не велика справа.
Вінс Пануччо,

2
(на даний момент int є псевдонімом System.Int32, але це може змінитися) ? Ой, прийшов один ... Ти серйозно?
Oybek

Чому б ви писали код мовою, якою ви хочете в кінцевому підсумку сміття? Схоже, за рішенням керівництва. Використовуйте int або Int32. Int32 виглядає як VB
Нік Тернер

Я мав на увазі те, що MAYBE, (і це великий МАЙБЕ, я не знаю, чому дизайнери зробили це так), ви повинні мати спосіб оголосити int, що має ту ж ширину, що арка, на якій ви працюєте, як int / long / ... працює. Це механізм (int to alias int32), який, здається, покликаний робити саме це. І врахуйте, що Microsoft завжди рекомендує використовувати "int" vs "Int32" (так, як це було б, якби це був їх початковий намір). Я знаю, що це велике, якщо я написав цю відповідь, не було 64-бітових .NET-фреймів, тому я не знав, що вони робитимуть у такому випадку.
Янко Ернандес Альварес

3

int - ярлик мови C # для System.Int32

Хоча це означає, що Microsoft може змінити це відображення, в публікації на обговоренні FogCreek зазначено повідомлення [джерело]

"Що стосується 64-бітового питання - Microsoft дійсно працює над 64-розрядною версією .NET Framework, але я впевнений, що INT НЕ буде відображати 64-бітну систему в цій системі.

Причини:

1. Стандарт C # ECMA спеціально говорить про те, що int - 32 біт, а довгий - 64 біт.

2. Майкрософт представив додаткові властивості та методи у Framework версії 1.1, які повертають довгі значення замість int-значень, наприклад Array.GetLongLength, крім Array.GetLength.

Тому я думаю, що можна впевнено сказати, що всі вбудовані типи C # збережуть своє поточне відображення ".


Якщо введена 64-розрядна версія, вони, ймовірно, додадуть "nativeint" до C # (як це зараз використовується у F #). Це просто підкреслює, що введення «int» та визначення цього як Int32 було помилкою! І так непослідовно з точки зору API (тобто ReadInt32 не ReadInt), кольору (темно проти світло-синього) та чутливості регістру (DateTime vs int). тобто чому тип значення "DateTime" не має псевдоніму типу Int32?
Карло Бос

3

int - це те саме, що і System.Int32, і при компіляції він перетвориться на те саме, що і в CIL .

Ми використовуємо int за умовою в C #, оскільки C # хоче виглядати як C і C ++ (і Java), і саме це ми використовуємо там ...

До речі, я все-таки використовую System.Int32 при декларуванні імпорту різних функцій API API. Я не впевнений, це визначена конвенція чи ні, але це нагадує мені, що я переходжу до зовнішньої DLL ...


3

Колись тип даних int був прив’язаний до розміру регістра машини, на яку спрямований компілятор. Так, наприклад, компілятор для 16-бітної системи використовував би 16-бітове ціле число.

Однак ми, на щастя, більше не бачимо 16-розрядних версій, і коли 64-розрядні почали залучати популярних людей були більше заклопотані про те, щоб зробити його сумісним із старішим програмним забезпеченням, а 32-розрядний був так довгий, що для більшості компіляторів це int прийнято вважати 32 біта.


3

Я рекомендую використовувати StyleCop Microsoft .

Це як FxCop , але для проблем, пов'язаних зі стилем. Конфігурація за замовчуванням відповідає внутрішнім посібникам стилю Microsoft, але їх можна налаштувати під ваш проект.

Це може зайняти трохи звикання, але це безумовно робить ваш код приємнішим.

Ви можете включити його у свій процес збирання, щоб автоматично перевірити наявність порушень.


Я повністю не згоден зі StyleCop в цьому. так, це добре, але я вважаю за краще використовувати Int32, чому? щоб уникнути відповідей, як у двох зворотних. Люди плутають Int32 із тим, як інти представлені в С
Джон Деметріу

2

intі Int32те саме. intпсевдонім для Int32.


int не псевдонім, це ключове слово. Дивіться інші відповіді.
Тиморес

int, безумовно, ключове слово для мови, але його також можна назвати псевдонімом System.Int32. Крім того, ще один спосіб подумати про це - мати using int = System.Int32; директиву для всіх файлів вихідного коду.
uygar donduran

2

Вам не варто байдуже. Якщо розмір викликає занепокоєння, я б використовував байт, короткий, int, а потім довгий. Єдина причина, що ви використовуєте int, більший за int32, - це якщо вам потрібно число, що перевищує 2147483647 або менше -2147483648.

Окрім того, що мені було б байдуже, є ще багато інших предметів, про які варто зайнятися.


Додам, що ви можете використовувати ключове слово "long" замість System.Int64
Keith

22
Ви неправильно зрозуміли питання. ОП запитує, чи є різниця між деклараціями "int i" та "Int32 i".
ворон

2

Це не має ніякої різниці в практиці і в часі ви приймете власну конвенцію. Я схильний використовувати ключове слово при призначенні типу та версію класу при використанні статичних методів тощо:

int total = Int32.Parse("1009");


1

Я використовую int у тому випадку, якщо Microsoft змінить реалізацію за замовчуванням на ціле число на якусь нову розкручену версію (назвемо це Int32b).

Потім Microsoft може змінити псевдонім int на Int32b, і мені не потрібно змінювати будь-який код, щоб скористатися їх новою (і, сподіваюся, покращеною) цілою реалізацією.

Те саме стосується будь-яких ключових слів типу.


0

Вам не варто піклуватися про більшість мов програмування, якщо вам не потрібно написати дуже специфічні математичні функції або код, оптимізований для однієї конкретної архітектури ... Просто переконайтеся, що розмір типу достатній для вас (використовуйте щось більше, ніж Int, якщо ви знайте, вам знадобиться більше 32 біт, наприклад)


0

Це не має значення. int - це мовне ключове слово, а Int32 - його фактичний тип системи.

Дивіться також мою відповідь тут на пов'язане питання.


0

Використання Int або Int32 - це той самий Int - це лише цукор для спрощення коду для читача.

Використовувати варіант Nullable Int? чи Int32? коли ви працюєте з базами даних на полях, що містять null. Це позбавить вас від безлічі проблем виконання.


0

Деякі компілятори мають різні розміри для int на різних платформах (не визначено C #)

Деякі стандарти кодування (MISRA C) вимагають, щоб усі використовувані типи були вказані в розмірі (тобто Int32, а не int).

Також добре вказати префікси для змінних різних типів (наприклад, b для 8-бітного байту, w для 16-бітного слова, l для 32-бітного слова => Int32 lMyVariable)

Вам слід потурбуватися, оскільки це робить ваш код більш портативним та більш ретельним.

Переносний може не застосовуватися до C #, якщо ви завжди будете використовувати C # і специфікація C # ніколи не зміниться в цьому плані.

Відновний ihmo завжди буде застосований, тому що особа, яка підтримує ваш код, може не знати про цю специфікацію C #, і пропустити помилку, якщо час від часу стає більше 2147483647.

У простому циклі for-циклу, який налічує, наприклад, місяці року, вам не буде байдуже, але коли ви використовуєте змінну в контексті, де вона могла б перейти в потоки, вам слід подбати.

Вам також слід подбати про те, чи збираєтеся ви робити на ньому трохи розумні операції.


Це не має ніякої різниці у .Net - int завжди Int32, а довгий завжди Int64
Кіт

It is also good to specify prefixes for different type variablesУгорська нотація сьогодні значною мірою застаріла, і більшість стилів кодування відштовхують її від використання. Внутрішні конвенції програмних компаній також часто забороняють цю нотацію
phuclv

0

Для використання Int32типу потрібне посилання на простір імен Systemабо повністю кваліфікований ( System.Int32). Я схильний до цього int, оскільки він не вимагає імпорту простору імен, тому зменшує ймовірність зіткнення простору імен у деяких випадках. При компіляції в IL немає різниці між ними.


0

Відповідно до негайного вікна в 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

0

Також розглянемо Int16. Якщо вам потрібно зберігати Integer у пам’яті у вашому додатку, і ви стурбовані кількістю використовуваної пам’яті, тоді ви можете піти з Int16, оскільки він використовує меншу пам’ять і має менший діапазон min / max, ніж Int32 (що таке int .)


0

Деякий час назад я працював над проектом із Microsoft, коли ми відвідували когось із команди продуктів Microsoft .NET CLR. Ця людина кодувала приклади, і коли він визначав свої змінні, він використовував "Int32" проти "int" і "String" проти "string".

Я пам’ятав, як бачив цей стиль в іншому прикладі коду від Microsoft. Отже, я провів деякі дослідження і виявив, що всі кажуть, що між Int і Int не існує різниці, крім синтаксичного забарвлення. Насправді я знайшов багато матеріалів, які пропонують використовувати “Int32”, щоб зробити ваш код більш читабельним. Отже, я прийняв стиль.

Днями я знайшов різницю! Компілятор не дозволяє вводити enum за допомогою "Int32", але це відбувається, коли ви використовуєте "int". Не питайте мене, чому я ще не знаю.

Приклад:

public  enum MyEnum : Int32
{
    AEnum = 0
}

Це працює.

public enum MyEnum : int
{
    AEnum = 0
}

Взято з позначень Int32 проти int

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.