2013-05-08 2 views
0

Являются ли эти два шаблона String Concatenation потреблением такого же объема памяти?Использование памяти конкатенации строк в C#

//Method 1 
String testString = "Test " + " string " + " content"; 

//Method 2 
String testString = "Test "; 
testString = testString + " string "; 
testString = testString + " content"; 

Если мы избегаем обоих этих методов и использовать StringBuilder класс?

+7

Первый будет * скомпилирован * до одной строки, поэтому второй пример является единственным, который фактически приведет к конкатенации во время выполнения. – dlev

+2

Действительно ли это имеет значение? ;) http://www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theater.html – dana

+0

Я мог бы выбрать '.Format()' или 'StringBuilder' согласно контекст. Ссылки даны имеют очень хорошие примеры. И, как уже упоминалось, вы увидите, что я никогда не использую оператор '+' для строк. – Jack

ответ

2

Способ 2 приведет к более распределению памяти, строка объект должен быть создан, чтобы хранить следующие комбинации

1) "Test " 
2) " String" 
3) "Test string" 
4) " Content" 
5) "Test String Content" 

Где в случае метода 1, должна быть создана только одна строка

1) "Test string Content" 

Метод 1 должен быть предпочтительным среди этих двух методов

StringBuilder класс более эффективен, когда необходимо построить строку t hat включает объединение множества строковых значений.

2

Да, StringBuilder - лучший вариант. Во всех остальных случаях, которые вы описываете, вы создаете несколько новых строк, поскольку строки неизменны в C# и не могут быть изменены. Это приводит к тому, что C# имитирует изменения в строках, создавая новые строки.

Метод можно преобразовать в одну строку. Нет необходимости конкатенировать фиксированные подстроки для построения строки

0

На мой взгляд, это большая разница между этими двумя методами. После сборки в методе 1 строка testString = «Содержимое тестовой строки», , но в методе 2 строка testString = «Test», во время выполнения, они также различны, в методе 1 строка testString просто ссылается на адрес в неизменяемом, но в методе 2 clr выделяет новую память в кучу и объединяет строки вместе. И я думаю, что StringBuilder - хороший способ для объединения строк часто.

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