Комментарии 10
Я когда-то, может даже на хабре, прочитал, что конкатенация трех строк преобразуется в две конкатенации и с тех пор использовал Concat вручную для 3-4 строк. А еще не задумывался о сложении 7-10 строк, где оказывается лучше было вместо Concat использовать StringBuilder. Спасибо.
0
Я когда-то, может даже на хабре, прочитал, что конкатенация трех строк преобразуется в две конкатенации и с тех пор использовал Concat вручную для 3-4 строк.
Тоже когда то думал делать так, но после написания первого кода с таким подходом понял, что выигрыш в производительности минимален, а вот читабельность падает в разы.
Добавление: что с тегами? Они у меня не работают.
Тоже когда то думал делать так, но после написания первого кода с таким подходом понял, что выигрыш в производительности минимален, а вот читабельность падает в разы.
Добавление: что с тегами? Они у меня не работают.
0
«Это карма, чувак»
habrahabr.ru/info/help/karma/ — тут табличка
habrahabr.ru/info/help/karma/ — тут табличка
+2
На самом деле если конкатенация происходит не в цикле, то даже при 7-10 строк можно использовать String.Concat.
Его реализация, так же как и для 3 строк подсчитывает суммарную длинну строки и единожды выделяет для нее память.
Тот же StringBuilder внутри себя содержит массив char[] (точнее он является связным списком), так что наклодные расходы по памяти будут и там, но код теряет читабельност при этом.
Его реализация, так же как и для 3 строк подсчитывает суммарную длинну строки и единожды выделяет для нее память.
Тот же StringBuilder внутри себя содержит массив char[] (точнее он является связным списком), так что наклодные расходы по памяти будут и там, но код теряет читабельност при этом.
+2
На самом деле на практике даже если конкатенация в цикле происходит как правило StringBuilder использовать не стоит. Потому, как правило это указывает на антипаттерн «стрингли тайпед девелопмент». И этой конкатенации нужно было с самого начала избежать.
Это встречается например когда люди сериализуют обьекты руками вместо того, чтобы использовать библиотеки сериализации или формируют верстку руками, вместо того, чтобы использовать шаблоны верстки.
Если я вижу StriingBuilder в коде — обычно для меня это сигнал, что работа со строками используется не по назначению. И люди вместо того, чтобы от нее избавиться, впихнули стринг билдер. А если речь о какой то элементарной конкатенации строк — то нужен не он, а Concat или String.Format или String.Join. Это читабельней и как правило не может быть дырой производительности ни при каких условиях.
Количество реальных ситуаций, когда использование StringBuilder — правильное решение — исчезающе мало. Самописные библиотеки сериализации возможно. На серьезных проектах — это как правило smell архитектурных проблем.
Это встречается например когда люди сериализуют обьекты руками вместо того, чтобы использовать библиотеки сериализации или формируют верстку руками, вместо того, чтобы использовать шаблоны верстки.
Если я вижу StriingBuilder в коде — обычно для меня это сигнал, что работа со строками используется не по назначению. И люди вместо того, чтобы от нее избавиться, впихнули стринг билдер. А если речь о какой то элементарной конкатенации строк — то нужен не он, а Concat или String.Format или String.Join. Это читабельней и как правило не может быть дырой производительности ни при каких условиях.
Количество реальных ситуаций, когда использование StringBuilder — правильное решение — исчезающе мало. Самописные библиотеки сериализации возможно. На серьезных проектах — это как правило smell архитектурных проблем.
-1
На самом деле если конкатенация происходит не в цикле, то даже при 7-10 строк можно использовать String.Concat.
Его реализация, так же как и для 3 строк подсчитывает суммарную длинну строки и единожды выделяет для нее память.
Тот же StringBuilder внутри себя содержит массив char[] (точнее он является связным списком), так что наклодные расходы по памяти будут и там, но код теряет читабельност при этом.
Упс… дважды отправил
Его реализация, так же как и для 3 строк подсчитывает суммарную длинну строки и единожды выделяет для нее память.
Тот же StringBuilder внутри себя содержит массив char[] (точнее он является связным списком), так что наклодные расходы по памяти будут и там, но код теряет читабельност при этом.
Упс… дважды отправил
0
В Java, насколько я знаю, если «foo» + «bar» указаны как литералы, то они становятся одной строкой на этапе компиляции, а вот в runtime уже никаких оптимизаций нет. И если нам нужно складывать много строк в runtime, то пользуются StringBuilder'ом
0
Да литералы конкатенируются на этапе компиляции, а не литералы используют StringBuilder.append.
0
Интересно дела обстоят. Есть вопрос по поводу «реализации конкатенации для трех строк» на с#. Это ведь реальный статический метод из класса String для конкатенации трех строк?
P.s за сравнение с java спасибо, но было бы также очень интересно узнать, как обстоят дела в javascript. Имхо, там конкатенация вопрос куда более частый, а следовательно и детали чрезвычайно важны.
P.s за сравнение с java спасибо, но было бы также очень интересно узнать, как обстоят дела в javascript. Имхо, там конкатенация вопрос куда более частый, а следовательно и детали чрезвычайно важны.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Так ли прост строковый оператор +