Строка продолжает символ в C#

У нас есть модульный тест с переменной, которая содержит очень длинную строку.

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

В VB существует строка, продолжают символ, есть ли в C# equivilant?

58
задан 3 November 2010 в 13:34

1 ответ

В его превосходном ответе StuartLC цитирует ответ к связанному вопросу и упоминает, что размещение новых строк в {expression} из интерполированной строки "выглядит нечетным". Большинство согласилось бы, но неприятное последствие исходного кода может быть смягчено несколько - и без любых последствий во время выполнения - при помощи специализированного {expression} блоки, которые решают к default(String), то есть, null (и конкретно не String.Empty).

(хотя незначительный) точка к не путаница, или загрязните свой фактический контент выражения, вместо этого используя специализированный маркер с этой целью. Таким образом, если Вы объявляете константу, например:

const String more = null;

... затем строка, которая могла бы быть слишком длинной для взгляда на в исходном коде, такой как...

var s1 = $"one: {99 + 1} two: {99 + 2} three: {99 + 3} four: {99 + 4} five: {99 + 5} six: {99 + 6}";

... может быть вместо этого записан как это.

var s2 = $@"{more
    }one: {99 + 1} {more
    }two: {99 + 2} {more
    }three: {99 + 3} {more
    }four: {99 + 4} {more
    }five: {99 + 5} {more
    }six: {99 + 6}";

Или возможно Вы предпочитаете другой "нечетный" подход к тому же самому:

// elsewhere:
public const String Ξ = null;  // Unicode '\u039E', Greek 'Capital Letter Xi'

// anywhere:
var s3 = $@"{
           Ξ}one: {99 + 1} {
           Ξ}two: {99 + 2} {
           Ξ}three: {99 + 3} {
           Ξ}four: {99 + 4} {
           Ξ}five: {99 + 5} {
           Ξ}six: {99 + 6}";

Все три примера производят тот же string во времени выполнения, которое в этом случае является всем на одной строке:

one: 100 two: 101 three: 102 four: 103 five: 104 six: 105

Как предложенный Stuart, производительность IL сохраняется в обоих этих примерах, не используя + для конкатенации строк. Хотя более длинная строка формата в моем новом примере действительно хранится в IL и таким образом Вашем исполняемом файле, пустые заполнители, на которых это ссылается, не инициализируются, и нет никаких избыточных конкатенаций или вызовов функции во времени выполнения. Для сравнения вот IL для вышеупомянутых двух примеров.

IL для первого примера

ldstr "one: {0} two: {1} three: {2} four: {3} five: {4} six: {5}"
ldc.i4.6
newarr object
dup
ldc.i4.0
ldc.i4.s 100
box int32
stelem.ref
dup
ldc.i4.1
ldc.i4.s 101
box int32
stelem.ref
dup
ldc.i4.2
ldc.i4.s 102
box int32
stelem.ref
dup
ldc.i4.3
ldc.i4.s 103
box int32
stelem.ref
dup
ldc.i4.4
ldc.i4.s 104
box int32
stelem.ref
dup
ldc.i4.5
ldc.i4.s 105
box int32
stelem.ref
call string string::Format(string, object[])

IL для второго примера

ldstr "{0}one: {1} {2}two: {3} {4}three: {5} {6}four: {7} {8}five: {9} {10}six: {11}"
ldc.i4.s 12
newarr object
dup
ldc.i4.1
ldc.i4.s 100
box int32
stelem.ref
dup
ldc.i4.3
ldc.i4.s 101
box int32
stelem.ref
dup
ldc.i4.5
ldc.i4.s 102
box int32
stelem.ref
dup
ldc.i4.7
ldc.i4.s 103
box int32
stelem.ref
dup
ldc.i4.s 9
ldc.i4.s 104
box int32
stelem.ref
dup
ldc.i4.s 11
ldc.i4.s 105
box int32
stelem.ref
call string string::Format(string, object[])
0
ответ дан 1 November 2019 в 13:59

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

Похожие вопросы: