Да. Это гарантируется спецификацией C#. Это находится в разделе 7.18 (спецификации C# 3.0):
Каждый раз, когда выражение выполняет упомянутые выше требования, выражение оценено во время компиляции. Это верно, даже если выражение является подвыражением большего выражения, которое содержит непостоянные конструкции.
("Требования, упомянутые выше", включают +, оператор относился к двум константным выражениям.)
См. также этот вопрос .
Просто примечание стороны по связанному предмету - компилятор C# также 'оптимизирует' несколько конкатенаций, включающих нелитералы с помощью' +
' оператор к единственному вызову к перегрузке мультипараметра Строки. Concat () метод.
Так
string result = x + y + z;
компиляции к чему-то эквивалентному
string result = String.Concat( x, y, z);
, а не более наивная возможность:
string result = String.Concat( String.Concat( x, y), z);
Ничто важнейшее, но просто требуемый для добавления этого бита к дискуссии об оптимизации конкатенации строкового литерала. Я не знаю, получает ли это поведение мандат по стандарту языка или нет.
Да.
C# не только оптимизирует конкатенацию строковых литералов, это также сворачивает эквивалентные строковые литералы в константы и использует указатели для ссылки на все ссылки на ту же константу.
Из первых уст:
Конкатенация является процессом добавления одной строки до конца другой строки. При конкатенации строковых литералов или строковых констант при помощи + оператор компилятор создает единственную строку. Никакая конкатенация времени выполнения не происходит. Однако строковые переменные могут быть связаны только во время выполнения. В этом случае необходимо понять последствия производительности различных подходов.
Я верю ответу на то, который является да, но необходимо было бы посмотреть на то, что компилятор выкладывает... просто компиляцию, и используйте отражатель на нем:-)