2008-11-13 2 views

ответ

44

Да. Это гарантируется спецификацией C#. Это в разделе 7.18 (из спецификации C# 3.0):

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

("Требование, перечисленное выше," включает в себя оператор + применяется к двум константным выражениям.)

Смотрите также this question.

+0

То же самое с VB.NET Я бы предположил, правильно? – Larsenal 2008-11-13 23:52:14

+0

Не уверен - это проблема языка, а не фреймворк. – 2008-11-13 23:56:55

2

Я считаю, что ответ на это да, но вы должны смотреть на то, что компилятор выплевывает ... просто скомпилировать и использовать отражатель на нем :-)

7

Да.

C# не только оптимизирует конкатенацию строковых литералов, но и сводит эквивалентные строковые литералы в константы и использует указатели для ссылки на все ссылки на одну и ту же константу.

4

От устья лошадей:

конкатенации является процесс добавления одной строки в конец другой строки. Когда вы объединяете строковые литералы или строковые константы с помощью оператора +, компилятор создает одну строку. Не происходит конкатенации времени выполнения. Однако строковые переменные могут быть объединены только во время выполнения. В этом случае вы должны понимать последствия для работы различных подходов.

http://msdn.microsoft.com/en-us/library/ms228504.aspx

20

Просто примечание стороны на схожую тему - компилятор С # также «оптимизировать» несколько конкатенации, связанных с не-литералы помощью «+» оператора одного вызова к перегрузке многопараметрической метода String.Concat().

Так

string result = x + y + z; 

компилирует к чему-то эквивалентное

string result = String.Concat(x, y, z); 

, а не более наивным возможности:

string result = String.Concat(String.Concat(x, y), z); 

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

2

У меня был аналогичный вопрос, но про VB.NET вместо C#. Самый простой способ проверить это - просмотреть скомпилированную сборку в Reflector.

Ответом было то, что компилятор C# и VB.NET оптимизирует конкатенацию строковых литералов.

5

Да - вы можете это явно увидеть с помощью ILDASM.

Пример:

Вот программа, которая похожа на ваш пример с последующим скомпилированным кодом CIL:

Примечания: Я использую функцию String.Concat(), чтобы посмотреть, как компилятор трактует два разных метода конкатенации.

Программа

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = "test " + "this " + "function"; 
     string ss = String.Concat("test", "this", "function"); 
    } 
} 

ILDASM

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  29 (0x1d) 
    .maxstack 3 
    .locals init (string V_0, 
      string V_1) 
    IL_0000: nop 
    IL_0001: ldstr  "test this function" 
    IL_0006: stloc.0 
    IL_0007: ldstr  "test" 
    IL_000c: ldstr  "this" 
    IL_0011: ldstr  "function" 
    IL_0016: call  string [mscorlib]System.String::Concat(string, 
                   string, 
                   string) 
    IL_001b: stloc.1 
    IL_001c: ret 
} // end of method Program::Main 

Обратите внимание, как на IL_0001 компилятор создал постоянную "протестировать эту функцию" в противоположность тому, как компилятор обрабатывает String.Concat () - которая создает константу для каждого из параметров .Concat(), а затем вызывает функцию .Concat().

Смежные вопросы