Как в C# лучше всего распределить однострочный строковый литерал по нескольким строкам исходного кода?

Предположим, что у вас есть длинная строка (> 80 символов), которую вы хотите распределить по нескольким исходным строкам, но не хотите включать символы новой строки.

Один из вариантов - объединить подстроки:

string longString = "Lorem ipsum dolor sit amet, consectetur adipisicing" +
    " elit, sed do eiusmod tempor incididunt ut labore et dolore magna" +
    " aliqua. Ut enim ad minim veniam";

Есть ли лучший способ, или это лучший вариант?

Редактировать: под «лучшим» я подразумеваю кодировщику проще всего читать, писать и редактировать. Например, если вам нужны символы новой строки, это очень просто посмотреть:

string longString =
@"Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam";

Мне интересно, есть ли что-то столь же чистое, когда вам не нужны новые строки.


person Matthew    schedule 02.01.2010    source источник


Ответы (7)


Я бы использовал вариант вашего метода:

string longString =
    "Lorem ipsum dolor sit amet, consectetur adipisicing " + 
    "elit, sed do eiusmod tempor incididunt ut labore et dolore magna " + 
    "aliqua. Ut enim ad minim veniam.";

Здесь я начинаю строку со строки после знака равенства, чтобы все они выровнялись, а также удостоверяюсь, что в конце строки есть пробел (опять же, для целей выравнивания).

person bobbymcr    schedule 02.01.2010
comment
Такой подход мне нравится больше всего. - person John Feminella; 02.01.2010
comment
Также хорошо, что компилятор C# объединяет такие строковые литералы во время компиляции, так что это не связано с затратами во время выполнения. - person LBushkin; 02.01.2010
comment
Вы когда-нибудь пробовали это, чтобы разделить даже несколько абзацев исходного кода? Это утомительная работа по сравнению с преобразованием строки @. - person Tj Kellie; 28.01.2014
comment
Это все, что я хотел! - person Marj; 08.08.2017
comment
@EricLippert, я предполагаю, что компилятор все еще выполняет эти оптимизации при использовании интерполяции строк. - person Jodrell; 31.07.2019
comment
@Jodrell: я не уверен, на каком основании вы делаете это предположение; интерполированная строка — это синтаксический сахар для вызова Format. Сворачиваются ли такие вызовы во время компиляции, я не знаю; Предлагаю попробовать и узнать! - person Eric Lippert; 13.08.2019

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

string verbatimLit = @" 
   __   __  
  /  `-'  \ 
 /_| N   |_\  Sometimes
   |  I  |    format in code
   |   N |    matters
   |_____|  
";

Затем удалите символы новой строки из строки в 1 строке,

verbatimLit.Replace(Environment.NewLine, " ");
person Tj Kellie    schedule 02.01.2010
comment
Хороший подход. Хотя разве вы не хотели бы заменить каждую новую строку пробелом? В противном случае contents<newline>here станет contentshere вместо contents here. (Или можно было бы добавлять пробел перед каждой строкой, следующей за первой.) - person DavidRR; 23.01.2014

Ваша первоначальная идея, вероятно, является самым простым способом внедрить литеральную строку в ваш код. Компилятор C# объединяет литералы, соединенные с +, так что это фактически эквивалентно одной очень длинной строке.

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

person LBushkin    schedule 02.01.2010

Для SQL-запросов или других длинных строк с собственным синтаксисом я иногда делаю что-то вроде этого:

        private const string QUERY = @"
SELECT *
FROM Table1 AS T1
INNER JOIN Table2 AS T2 ON T1.ID = T2.T1ID
WHERE T1.VALUE = @P1
GROUP BY T2.OTHERVALUE
";

Это оставляет форматирование строки нетронутым.

person John Saunders    schedule 02.01.2010

Следуя ответу Tj Kellie, в С# 6.0 вы можете легко иметь одну инструкцию для выполнения конкатенации и встраивания различной информации посредством интерполяции строк, а также без новых строк, несмотря на определение строки в нескольких строках.

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

public int? BestTime { get; set; }
public int? WorstTime { get; set; }
public int? AvgTime { get; set; }
public int TimeoutReachedCount { get; set; }
public int AllRunCount { get; set; }

public string Str => $@"
   Ran {AllRunCount} times; 
   Reached timeout {TimeoutReachedCount} times; 
   Best time = {(BestTime.HasValue ? BestTime.ToString() : "N/A")}; 
   Worst time = {(WorstTime.HasValue ? WorstTime.ToString() : "N/A")}; 
   Average time = {(AvgTime.HasValue ? AvgTime.ToString() :"N/A")};"
       .Replace(Environment.NewLine, "");

Конечно, следует проявлять особую осторожность при добавлении пробелов в конце строк, чтобы избежать слияния слов.

person Alexei - check Codidact    schedule 14.03.2017

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

person Johannes Rudolph    schedule 02.01.2010
comment
Покажите пример использования таких строк в файле ресурсов. - person John Saunders; 02.01.2010
comment
Файлы ресурсов великолепны, но тогда вы смотрите на ввод-вывод и хранилище. Может быть проблемой для кросс-платформенных приложений, но я стараюсь использовать файлы ресурсов, если это разумно. - person Craig.C; 06.01.2021

Вы можете использовать несколько констант, а затем объединить их в одну большую строку:

const string part1 = "part 1";
const string part2 = "part 2";
const string part3 = "part 3";
string bigString = part1 + part2 + part3;

Компилятор в любом случае "свернет" эти константы в одну большую строку, так что этот метод вообще не требует затрат времени выполнения по сравнению с исходным примером кода.

У такого подхода есть ряд преимуществ:

  1. Подстроки можно легко повторно использовать в других частях приложения.
  2. При желании подстроки могут быть определены в нескольких файлах или типах.
person Eilon    schedule 02.01.2010