Лучший способ разбить длинные строки в исходном коде C#

Мне интересно, как лучше всего разбивать длинные строки в исходном коде C#. Эта строка

"string1"+
"string2"+
"string3"

объединены во время компиляции или во время выполнения?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
39
0
38 663
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Объединение выполняется во время компиляции, поэтому нет дополнительных затрат времени выполнения.

Ответ принят как подходящий

Это делается во время компиляции. Это в точности эквивалентно "string1string2string3".

Предположим, у вас есть:

string x = "string1string2string3"
string y = "string1" + "string2" + "string3"

Компилятор выполнит соответствующее интернирование, так что x и y относятся к одним и тем же объектам.

Обновлено: В ответах и ​​комментариях много говорится о StringBuilder. Многие разработчики, кажется, считают, что конкатенация строк должна выполняться всегда с помощью StringBuilder. Это чрезмерное обобщение - стоит понять почему StringBuilder хорош в одних ситуациях, а в других нет.

Разве вы не можете использовать StringBuilder?

Это сделает код менее читабельным. и - менее производительным. Другими словами, это было бы плохо.

Jon Skeet 12.11.2008 13:20

Честно говоря, я подумал, что если вы выполняете много конкатенации, то рекомендуется использовать конструктор строк?

Damien 12.11.2008 13:23

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

Maxam 12.11.2008 13:24

И даже если конкатенация выполняется во время выполнения, объединение двух строк с помощью «+» происходит быстрее, чем при использовании StringBuilder.

Jon Skeet 12.11.2008 13:25

Ну, я сказал "много" =) Но ты прав, я должен был квалифицировать это дальше.

Maxam 12.11.2008 13:27

Ваш пример будет объединен во время компиляции. Все строковые строковые и константные строковые переменные объединяются во время компиляции.

Следует иметь в виду, что включение любых строк только для чтения приведет к задержке конкатенации до времени выполнения. string.Empty и Environment.NewLine являются строковыми переменными только для чтения.

это действительно зависит от того, что вам нужно. Как правило, если вам нужно объединить строки, наилучшая производительность во время выполнения будет достигнута при использовании StringBuilder. Если вы ссылаетесь в исходном коде на что-то вроде var str = "String1" + "String2", оно будет преобразовано в строку str = "String1String2" при компиляции. В этом случае у вас нет накладных расходов на конкатенацию

Ваше обобщение слишком общее - если вы можете выполнить всю конкатенацию за один раз, это обычно быстрее (и более читабельно), чем при использовании StringBuilder. Поэтому предпочитайте «x + y + z» новому StringBuilder (x) .Append (y) .Append (z) .ToString (). StringBuilder полезен, когда есть конкатенации повторяется.

Jon Skeet 12.11.2008 13:22

Ко второму пункту Джона ... StringBuilder полезен при создании циклов и т. д. Для одного набора операций string.Concat проще и работает так же.

Marc Gravell 12.11.2008 13:27

Спасибо, Марк - у меня закончилось место :) Отредактировал свой ответ, чтобы указать на мою статью о StringBuilder ...

Jon Skeet 12.11.2008 13:27

+ оператор фактически вызывает метод concat. Если вы посмотрите на реализацию StringBuilder, она немного умнее :)

Tamir 12.11.2008 13:32

Если пробелы не важны, вы можете использовать экранирующий символ @ для записи многострочных строк в вашем коде. Это полезно, если в вашем коде есть запрос, например:

string query = @"SELECT whatever
FROM tableName
WHERE column = 1";

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

StringBuilder - хороший способ пойти, если у вас много (более четырех) строки для объединения. Это быстрее.

Использование String.Concat в приведенном выше примере выполняется во время компиляции. Поскольку это буквальные строки, они оптимизируются компилятором.

Однако если вы используете переменные:

string a = "string1";
string b = "string2";
string c = a + b;

Это делается во время выполнения.

«Больше 4» актуально только при циклическом переборе набора данных; в противном случае идентичен одиночный вызов string.Concat (передача массива, если необходимо).

Marc Gravell 12.11.2008 13:28

То, что вы говорите, правда. dotnetperls.com/Content/StringBuilder-Performance.aspx

Sani Singh Huttunen 12.11.2008 13:29

StringBuilder будет вашим самым быстрым подходом, если вы используете любое количество строк.

http://dotnetperls.com/Content/StringBuilder-1.aspx

Если вы просто набираете несколько строк (5 или меньше - хорошее правило), скорость не будет иметь значения, какой тип конкатенации вы используете.

Построитель строк - это более быстрое решение время выполнения, но данное выражение лучше оценивать во время компиляции (что, я думаю, не должно быть проблемой для компилятора)

peterchen 12.11.2008 16:06

Есть какой-нибудь способ сделать это. Я предпочитаю использовать строковые методы из C#. Первый образец:

строка s = string.Format ("{0} {1} {0}", "Привет", "Автор"); результат s = "Привет, привет";

Как насчет следующего метод расширения (который вдохновлен методом общих тегов одна линия) ...

using System;
using System.Text.RegularExpressions;
using static System.Text.RegularExpressions.RegexOptions;

namespace My.Name.Space
{
    public static class StringHelper
    {
        public static string AsOneLine(this string text, string separator = " ")
        {
            return new Regex(@"(?:\n(?:\s*))+").Replace(text, separator).Trim();
        }
    }
}

... в сочетании с дословный строковый литерал, используемым как таковой:

var mySingleLineText = @"
    If we wish to count lines of code, we should not regard them
    as 'lines produced' but as 'lines spent'.
".AsOneLine();

Обратите внимание, что пробелы «внутри» строки остаются неизменными, например:

// foo      bar hello        world.
var mySingleLineText = @"
    foo      bar
    hello        world.
".AsOneLine();

Если вы не хотите, чтобы символы новой строки заменялись пробелами, то передайте "" в качестве аргумента методу расширения:

// foobar
var mySingleLineText = @"
    foo
    bar
".AsOneLine("");

Пожалуйста, обрати внимание: Эта форма конкатенации строк выполняется во время выполнения из-за задействованного вспомогательного метода (в отличие от конкатенации через оператор +, выполняемой во время компиляции, как также указано в принятом ответе). Так что, если производительность является проблемой, выбирайте +. Если вы имеете дело с длинными фразами и удобочитаемостью и в центре внимания «простота использования», то подход, предложенный выше, возможно, стоит рассмотреть.

Это, похоже, не позволяет использовать экранированные кавычки внутри строки, например. \ "

rv.kvetch 10.03.2021 18:36

Привет, с Verbatim String Literal @ вам всегда нужно прибегать к двойным кавычкам вместо косой черты ("\"), чтобы избежать кавычек, например @"hello ""{name}"", how are you"; см. Также: stackoverflow.com/a/556141/2477619

B12Toaster 11.03.2021 12:42

Другие вопросы по теме