Объявление длинной однострочной строки в C#

Есть ли достойный способ объявить длинную однострочную строку в С#, чтобы было невозможно объявить и/или просмотреть строку в редакторе?

Варианты, о которых я знаю, это:

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

string s = "this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  ";

2: @+новая строка. Это выглядит красиво в коде, но вводит новые строки в строку. Кроме того, если вы хотите, чтобы это выглядело красиво в коде, вы получаете не только новые строки, но и неудобные пробелы в начале каждой строки строки.

string s = @"this is my really long string.  this is my long string.
             this line will be indented way too much in the UI. 
This line looks silly in code.  All of them suffer from newlines in the UI.";

3: "" + ... Это прекрасно работает, но печатать очень неудобно. Если мне нужно где-то добавить текст на половину строки, я должен обновить все виды + и перемещать текст повсюду.

string s = "this is my really long string.  this is my long string. " + 
           "this will actually show up properly in the UI and looks " +
           "pretty good in the editor, but is just a pain to type out " +
           "and maintain";

4: string.format or string.concat. В основном то же самое, что и выше, но без плюсов. Имеет те же преимущества и недостатки.

Неужели нет способа сделать это хорошо?


person Cory    schedule 14.10.2009    source источник


Ответы (11)


Это зависит от того, как будет использоваться строка. Все ответы здесь действительны, но важен контекст. Если длинная строка «s» будет регистрироваться, она должна быть окружена защитным тестом ведения журнала, таким как этот пример Log4net:

if (log.IsDebug) {
    string s = "blah blah blah" + 
    // whatever concatenation you think looks the best can be used here,
    // since it's guarded...
}

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

Для других целей (создание строк SQL-запросов, запись в файлы [но для этого снова учитывайте ресурсы] и т. д.), когда вы объединяете больше, чем просто литералы, рассмотрите StringBuilder, как предлагает Ваэль Даллул, особенно если ваша строка может оказаться в функции, которая в какой-то момент в отдаленном будущем может быть вызвана много раз в критичном по времени приложении (все эти вызовы складываются). Я делаю это, например, при построении SQL-запроса, где у меня есть параметры, являющиеся переменными.

Кроме этого, нет, я не знаю ничего, что одновременно выглядело бы красиво и было бы легко набирать (хотя предложение переноса слов — хорошая идея, оно может плохо подходить для инструментов сравнения, распечатки кода или инструментов проверки кода). ). Это перерывы. (Лично я использую подход со знаком плюс, чтобы сделать перенос строк аккуратным для наших распечаток и обзоров кода).

person Ogre Psalm33    schedule 21.10.2009
comment
Конкатенация строковых литералов обрабатывается компилятором C#, поэтому при использовании строки, объявленной как "x"+"y"+"Z"+..., во время выполнения нет дополнительных затрат. - person Sam Harwell; 21.10.2009
comment
Ах, @ 280Z28, конечно, правильно! Я добавил некоторые разъяснения относительно того, когда использовать подход StringBuilder (когда у вас есть переменные, смешанные с вашими уровнями). - person Ogre Psalm33; 21.10.2009

Есть выход. Поместите свою очень длинную строку в resources. Вы даже можете поместить туда длинные фрагменты текста, потому что там должны быть тексты. Иметь их прямо в коде — очень плохая практика.

person Community    schedule 14.10.2009
comment
Мне нравится менять цветовую схему VS, чтобы строки отображались каким-то отвратительным цветом. Всегда напоминает мне, что происходит что-то плохое. - person DavidGouge; 14.10.2009
comment
Плохая практика да, но не всегда исправимая в устаревшем программном обеспечении (где менеджер проекта не видел света). - person stevehipwell; 14.10.2009
comment
@ Stevo3000: я считаю, что автор вопроса может это исправить. Вот почему он просит совета. - person ; 14.10.2009
comment
+1, хотя это не всегда может быть плохой практикой... подумайте о строках, которые предназначены только для разработчиков и никогда не видны пользователю (например, те, которые используются для диагностических целей). Накладные расходы (усилия) по поддержанию их в качестве ресурса могут не стоить того. - person Autodidact; 14.10.2009
comment
Я просто добавлял для полноты (для тех, кто нашел этот ответ через Google и т. Д.), Что это не всегда было возможно. Я поставил +1, как и все остальные. - person stevehipwell; 14.10.2009
comment
-1 на этом. Это не отвечает на вопрос, а также предлагает вводящую в заблуждение передовую практику, которая вызывает сомнения (например, см. комментарий SDX2000). - person Vytautas Šaltenis; 14.10.2009
comment
Согласен, это прекрасное решение, но есть ли способ сделать это встроенным? Я не решаюсь перефразировать вопрос, так как это, вероятно, лучший ответ. Судя по ответам всех остальных, ответ звучит так: хорошего пути нет. - person Cory; 16.10.2009
comment
Лучше всего работает с тем, что невозможно загрузить строку из строки ресурса. - person kkm; 07.10.2015

При использовании Visual Studio

Tools > Options > Text Editor > All Languages > Word Wrap

Я уверен, что любой другой текстовый редактор (включая блокнот) сможет это сделать!

person stevehipwell    schedule 14.10.2009
comment
Мне нравится этот вариант для кода, но не для таких огромных строк. - person MartW; 14.10.2009
comment
@CodeByMoonlight — Что такое длинная строка в исходном коде, как не код? Я не говорю, что это правильный подход, но он делает то, что написано на банке! Лично я бы хранил строки в качестве ресурса! - person stevehipwell; 14.10.2009
comment
Я использую эту опцию постоянно, просто она кажется неправильной для длинных строк, которые могут занимать несколько экранов. Ресурсный вариант лучше, как уже было сказано. - person MartW; 16.10.2009

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

string longString = @"Some long string, 
    with multiple whitespace characters 
    (including newlines and carriage returns)
    converted to a single space
    by a regular expression replace.";

longString = Regex.Replace(longString, @"\s+", " ");
person John Fisher    schedule 21.10.2009

Должен ли он быть определен в исходном файле? В противном случае определите его в ресурсе или файле конфигурации.

person d91-jal    schedule 14.10.2009

вы можете использовать StringBuilder следующим образом:

StringBuilder str = new StringBuilder();
str.Append("this is my really long string.  this is my long string. ");
str.Append("this is my really long string.  this is my long string. ");
str.Append("this is my really long string.  this is my long string. ");
str.Append("this is my really long string.  this is my long string. ");
string s = str.ToString();

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

person Wael Dalloul    schedule 14.10.2009
comment
Не знаю, почему этот ответ был оценен так низко. В нем есть пример кода, и использование StringBuilder является хорошей практикой, так как при многих конкатенациях это более эффективно. - person Ogre Psalm33; 14.10.2009
comment
Потому что в данной ситуации это просто добавляет лишние сложности. - person MartW; 14.10.2009
comment
Я не уверен, что в вопросе достаточно контекста, чтобы определить ситуацию. Это разовое сообщение при запуске приложения? Или это сообщение журнала в методе, вызываемом 100 раз в секунду? В этом случае производительность имеет значение. См. фактические измерения производительности: blog.briandicroce. com/2008/02/04/ - person Ogre Psalm33; 14.10.2009
comment
@Ogre: объединение строковых литералов обрабатывается компилятором C#. Использование StringBuilder на самом деле будет медленнее, чем использование "x"+"y", где последний имеет нулевые накладные расходы во время выполнения. - person Sam Harwell; 21.10.2009
comment
Подобное использование StringBuilder пахнет превентивной микрооптимизацией. blog.codinghorror.com/ - person tachylatus; 16.08.2017

Лично я бы прочитал такую ​​большую строку из файла, возможно, XML-документа.

person James    schedule 14.10.2009

Для действительно длинных строк я бы сохранил их в XML (или в ресурсе). В тех случаях, когда имеет смысл иметь его в коде, я использую конкатенацию многострочных строк с оператором +. Единственное место, где я могу это сделать, это модульные тесты для кода, который читает и анализирует XML, где я фактически пытаюсь избежать использования XML-файла для тестирования. Поскольку это модульный тест, я почти всегда хочу иметь строку прямо там, чтобы ссылаться на нее. В этих случаях я мог бы выделить их все в директиву #region, чтобы я мог показывать/скрывать ее по мере необходимости.

person tvanfosson    schedule 14.10.2009

Вы можете использовать StringBuilder

person Jimmeh    schedule 14.10.2009

Я либо просто позволяю ему работать, либо использую string.format и записываю строку в одну строку (метод let it run), но помещаю каждый из аргументов в новую строку, что либо облегчает чтение, либо, по крайней мере, дает читателю какое-то представление о том, что он может ожидать от длинной строки, не читая ее подробно.

person David Božjak    schedule 14.10.2009
comment
В качестве альтернативы можно разбить очень длинную строку и использовать string.Concat, чтобы соединить части. Это позволяет избежать чрезмерной +-ности правой стороны :-) - person Joey; 14.10.2009

Используйте Project / Properties / Settings в верхнем меню Visual Studio. Сделайте scope = "Application".

В поле «Значение» вы можете вводить очень длинные строки, и в качестве бонуса сохраняются переводы строк. Тогда ваш код может ссылаться на эту строку следующим образом:

string sql = Properties.Settings.Default.xxxxxxxxxxxxx;

person Max Drawbaugh    schedule 09.03.2018