Деклариране на многоооооооооооооооооооооооооооооооооооо един ред низ в C#

Има ли приличен начин да се декларира дълъг едноредов низ в 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, както предлага Wael Dalloul, особено ако вашият низ може евентуално да завърши във функция, която просто може, на някаква дата в далечното бъдеще, да бъде извикана много пъти в критично за времето приложение (Всички тези извиквания се събират). Правя това, например, когато създавам SQL заявка, където имам параметри, които са променливи.

Освен това, не, не знам за нищо, което едновременно да изглежда красиво и да е лесно за въвеждане (въпреки че предложението за пренасяне на думи е добра идея, може да не се превежда добре в инструменти за разлики, разпечатки на код или инструменти за преглед на код ). Това са почивките. (Аз лично използвам подхода със знак плюс, за да направя редовете чисти за нашите разпечатки и прегледи на кодове).

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

Има начин. Поставете своя много дълъг низ в ресурси. Можете дори да поставите там дълги части от текст, защото там трябва да бъдат текстовете. Наличието им директно в кода е наистина лоша практика.

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