Pull to refresh

Comments 10

Я когда-то, может даже на хабре, прочитал, что конкатенация трех строк преобразуется в две конкатенации и с тех пор использовал Concat вручную для 3-4 строк. А еще не задумывался о сложении 7-10 строк, где оказывается лучше было вместо Concat использовать StringBuilder. Спасибо.
Я когда-то, может даже на хабре, прочитал, что конкатенация трех строк преобразуется в две конкатенации и с тех пор использовал Concat вручную для 3-4 строк.
Тоже когда то думал делать так, но после написания первого кода с таким подходом понял, что выигрыш в производительности минимален, а вот читабельность падает в разы.
Добавление: что с тегами? Они у меня не работают.
На самом деле если конкатенация происходит не в цикле, то даже при 7-10 строк можно использовать String.Concat.
Его реализация, так же как и для 3 строк подсчитывает суммарную длинну строки и единожды выделяет для нее память.
Тот же StringBuilder внутри себя содержит массив char[] (точнее он является связным списком), так что наклодные расходы по памяти будут и там, но код теряет читабельност при этом.
На самом деле на практике даже если конкатенация в цикле происходит как правило StringBuilder использовать не стоит. Потому, как правило это указывает на антипаттерн «стрингли тайпед девелопмент». И этой конкатенации нужно было с самого начала избежать.

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

Если я вижу StriingBuilder в коде — обычно для меня это сигнал, что работа со строками используется не по назначению. И люди вместо того, чтобы от нее избавиться, впихнули стринг билдер. А если речь о какой то элементарной конкатенации строк — то нужен не он, а Concat или String.Format или String.Join. Это читабельней и как правило не может быть дырой производительности ни при каких условиях.

Количество реальных ситуаций, когда использование StringBuilder — правильное решение — исчезающе мало. Самописные библиотеки сериализации возможно. На серьезных проектах — это как правило smell архитектурных проблем.
На самом деле если конкатенация происходит не в цикле, то даже при 7-10 строк можно использовать String.Concat.
Его реализация, так же как и для 3 строк подсчитывает суммарную длинну строки и единожды выделяет для нее память.
Тот же StringBuilder внутри себя содержит массив char[] (точнее он является связным списком), так что наклодные расходы по памяти будут и там, но код теряет читабельност при этом.

Упс… дважды отправил
В Java, насколько я знаю, если «foo» + «bar» указаны как литералы, то они становятся одной строкой на этапе компиляции, а вот в runtime уже никаких оптимизаций нет. И если нам нужно складывать много строк в runtime, то пользуются StringBuilder'ом
Да литералы конкатенируются на этапе компиляции, а не литералы используют StringBuilder.append.
Интересно дела обстоят. Есть вопрос по поводу «реализации конкатенации для трех строк» на с#. Это ведь реальный статический метод из класса String для конкатенации трех строк?

P.s за сравнение с java спасибо, но было бы также очень интересно узнать, как обстоят дела в javascript. Имхо, там конкатенация вопрос куда более частый, а следовательно и детали чрезвычайно важны.
Да это реальный статический метод для конкатенации 2, 3 и 4 строк. Его можно вызвать на прямую, просто код станет менее читабельным, нежели используя оператор + который в него и разворачивается.
Sign up to leave a comment.

Articles