有一个简单的方法来创建一个多行字符串文字在c# ?
这是我现在拥有的:
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
我知道PHP
<<<BLOCK
BLOCK;
c#有类似的东西吗?
有一个简单的方法来创建一个多行字符串文字在c# ?
这是我现在拥有的:
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
我知道PHP
<<<BLOCK
BLOCK;
c#有类似的东西吗?
当前回答
我发现使用字符串文字的问题是,它会让你的代码看起来有点“奇怪”,因为为了在字符串本身中不获得空格,它必须完全左对齐:
var someString = @"The
quick
brown
fox...";
讨厌的东西。
因此,我喜欢使用的解决方案是:
var someString = String.Join(
Environment.NewLine,
"The",
"quick",
"brown",
"fox...");
当然,如果您只是想在逻辑上拆分SQL语句的行,而实际上并不需要新的行,那么您总是可以替换Environment。换行" "。
其他回答
为什么人们总是混淆字符串和字符串字面量?公认的答案是另一个问题的绝佳答案;但这次不是。
我知道这是一个老话题,但我来这里可能是带着和OP一样的问题,看到人们一直误解它是令人沮丧的。也许是我看错了,我不知道。
粗略地说,字符串是计算机内存中的一个区域,在程序执行期间,它包含可以映射到文本字符的字节序列。另一方面,字符串字面值是一段尚未编译的源代码,它表示稍后在程序执行期间用于初始化字符串的值。
在c#中,语句…
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
... 不生成三行字符串,而是生成一行字符串;三个字符串的连接(每个字符串从不同的文字初始化),其中没有一个包含换行修饰符。
OP似乎要问的问题——至少我用这些词要问的问题——不是如何在编译后的字符串中引入模仿源代码中的换行符,而是如何在不引入已编译字符串中的换行符的情况下,在源代码中拆分长而单行的文本以使其清晰。并且不需要延长执行时间,只需将来自源代码的多个子字符串连接起来即可。就像javascript或c++中多行字符串文字中的尾随反斜杠。
建议使用逐字字符串,别管StringBuilders, String。连接,甚至嵌套函数与字符串反转等等,让我认为人们没有真正理解这个问题。也许我不明白。
据我所知,c#没有(至少在我仍在使用的旧石器时代版本中,从上个十年开始)有一个功能,可以在编译而不是执行期间清晰地生成多行字符串字面量。
也许当前的版本确实支持它,但我想分享一下我在字符串和字符串字面量之间的区别。
更新:
(来自MeowCat2012的评论)你可以。OP的“+”方法是最好的。根据规范,优化是有保证的:http://stackoverflow.com/a/288802/9399618
如果你不想要空格/换行,字符串加法似乎可以工作:
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.
如果你愿意,你可以在这里运行上面的程序。
在c# 11[2022]中,您将能够使用原始字符串字面量。 Raw String Literals的使用使得使用“字符”更容易,而不必编写转义序列。
OP的解决方案:
string query1 = """
SELECT foo, bar
FROM table
WHERE id = 42
""";
string query2 = """
SELECT foo, bar
FROM table
WHERE id = 42
and name = 'zoo'
and type = 'oversized "jumbo" grand'
""";
更多关于原始字符串字面量的细节
参见原始字符串字面量GitHub问题的全部细节;和博客文章c# 11预览更新-原始字符串文字,UTF-8和更多!
另一个需要注意的问题是在string. format中使用字符串字面值。在这种情况下,你需要转义大括号/方括号'{'和'}'。
// 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)
是的,你可以把一个字符串分割成多行,而不需要在实际的字符串中引入换行符,但这并不漂亮:
string s = $@"This string{
string.Empty} contains no newlines{
string.Empty} even though it is spread onto{
string.Empty} multiple lines.";
诀窍是引入计算结果为空的代码,并且该代码可以包含换行符,而不会影响输出。我把这个方法用在了类似的问题上。
对于问题是什么,显然存在一些困惑,但有两个提示表明,我们在这里想要的是一个不包含任何换行符的字符串字面量,其定义跨越多行。(在评论中他这样说,“这就是我所拥有的”显示的代码不创建一个换行字符串)
这个单元测试显示了意图:
[TestMethod]
public void StringLiteralDoesNotContainSpaces()
{
string query = "hi"
+ "there";
Assert.AreEqual("hithere", query);
}
更改上述查询的定义,使其为一个字符串字面值,而不是两个字符串字面值的连接,编译器可能会优化为一个字符串字面值,也可能不会。
c++的方法是用反斜杠结束每一行,导致换行符被转义,并且不会出现在输出中。不幸的是,仍然存在第一行之后的每一行必须左对齐的问题,以便不向结果添加额外的空白。
只有一个选项不依赖于可能不会发生的编译器优化,那就是将定义放在一行上。如果你想依赖编译器优化,你已经有+很棒;你不需要左对齐字符串,结果中没有换行符,这只是一个操作,没有函数调用,期望优化。