Должен ли я использовать литералы типа данных?

#c# #types #literals #primitive-types

#c# #типы #Литералы #примитивные типы

Вопрос:

Например:

 ulong someVariable = 1000;
  

«1000» будет представлено компилятором как int правильно? Было бы лучшей идеей использовать…

 ulong someVariable = 1000UL;
  

Как это позволит избежать приведения? Это то, о чем я вообще должен беспокоиться?

Ответ №1:

нет, это не то, о чем вам когда-либо следует беспокоиться.

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

к вашему сведению, я подтвердил, что, по крайней мере, начиная с vs2012, компилятор Microsoft выдает точно такой же код в обоих случаях.

 IL_0000:  ldarg.0
IL_0001:  ldc.i4     0x3e8
IL_0006:  conv.i8
IL_0007:  stfld      uint64 ClassLibrary1.Class1::suffixed
IL_000c:  ldarg.0
IL_000d:  ldc.i4     0x3e8
IL_0012:  conv.i8
IL_0013:  stfld      uint64 ClassLibrary1.Class1::unsuffixed
  

Комментарии:

1. Спасибо за комментарий, есть ли какая-либо причина для этого? Выводит ли компилятор 1000 в любом случае как тип ulong? Или эти типы приведений не о чем беспокоиться?

2. Это скорее случай, когда программисты-компиляторы намного умнее нас, скромных разработчиков высокого уровня…

Ответ №2:

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

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