// this would give a format exception
string.Format(@"<script> function test(x)
{ return x * {0} } </script>", aMagicValue)
// this contrived example would work
string.Format(@"<script> function test(x)
{{ return x * {0} }} </script>", aMagicValue)
var myString = String.Format(
"hello " +
"world" +
" i am {0}" +
" and I like {1}.",
animalType,
animalPreferenceType
);
// hello world i am a pony and I like other ponies.
10 回答
它在C#中被称为verbatim string literal,它只是将@放在文字之前 . 这不仅允许多行,而且还会关闭转义 . 例如,您可以这样做:
逃脱的唯一一点是,如果你想要一个双引号,你必须添加一个额外的双引号符号:
另一个需要注意的是在string.Format中使用字符串文字 . 在这种情况下,您需要转义花括号/括号'{'和'}' .
我发现使用字符串文字的问题是它可以使你的代码看起来有点“怪异”,因为为了不在字符串本身中获取空格,它必须完全左对齐:
呸 .
因此,我喜欢使用的解决方案是:它使所有代码与代码的其余部分保持良好对齐:
当然,如果您只想逻辑地拆分SQL语句的行并且实际上不需要换行,那么您总是可以将
Environment.NewLine
替换为" "
.您可以使用以下两种方法:
在SplitLineToMultiline()中,您需要定义要使用的字符串和行长度,这非常简单 . 谢谢 .
您可以使用
string
前面的@
符号来形成verbatim string literal:当你使用这个方法时,你也是do not have to escape special characters,除了Jon Skeet的回答中所示的双引号 .
作为附注,使用C#6.0,您现在可以将插值字符串与逐字字符串文字组合:
我没有看到这个,所以我会在这里发布它(如果你有兴趣传递一个字符串,你也可以这样做 . )这个想法是你可以在多行上打破字符串并添加你自己的内容(也在多条线上)以任何你想要的方式 . 这里“tableName”可以传递给字符串 .
为什么人们会将字符串与字符串文字混淆?接受的答案是对不同问题的一个很好的答案;不是这个 .
我知道这是一个古老的话题,但我来到这里可能和OP一样,并且看到人们如何继续误读它是令人沮丧的 . 或许我误解了它,我不知道 .
粗略地说,字符串是计算机存储器的一个区域,在执行程序期间,它包含可以映射到文本字符的字节序列 . 另一方面,字符串文字是一段尚未编译的源代码,它表示稍后在执行出现的程序期间初始化字符串的值 .
在C#中,声明......
...不会产生三线串而是一根线;三个字符串的串联(每个字符串从不同的字面值初始化),其中没有一个字符串包含换行符 .
OP似乎要问的是 - 至少我会问这些话 - 不是如何在编译的字符串中引入模仿源代码中找到的换行符,而是如何为了清晰度而分解,源代码中的单行文本,不会在编译的字符串中引入中断 . 并且不需要延长执行时间,花费了来自源代码的多个子串 . 就像javascript或C中多行字符串文字中的尾部反斜杠一样 .
建议使用逐字字符串,永远不要使用字符串反转而不使用字符串反转的嵌套函数,这会让我觉得人们并没有真正理解这个问题 . 或许我不明白 .
据我所知,C#没有(至少在我使用的旧石器时代版本中,从前十年开始)有一个功能可以干净地生成多行字符串 literals ,可以在编译期间解决而不是执行 .
也许当前版本支持它,但我想我会分享我在字符串和字符串文字之间感知的差异 .
您可以使用 @ 和 "" .
如果您不想要空格/换行符,则字符串添加似乎有效:
如果您愿意,可以运行上面的here .