#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 или аналогичный. Сюда входят такие вещи, как конкатенация строк литералов.
Так что нет, не беспокойтесь об этом в данном случае. Если бы вы делали что-то более тонкое: возможно.