有一个简单的方法来创建一个多行字符串文字在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#有类似的东西吗?
当前回答
添加多行:使用@
string query = @"SELECT foo, bar
FROM table
WHERE id = 42";
在中间添加字符串值:使用$
string text ="beer";
string query = $"SELECT foo {text} bar ";
多行字符串中间添加值:使用$@
string text ="Customer";
string query = $@"SELECT foo, bar
FROM {text}Table
WHERE id = 42";
其他回答
你可以在字符串前面使用@符号来形成一个逐字逐句的字符串字面量:
string query = @"SELECT foo, bar
FROM table
WHERE id = 42";
使用此方法时,您也不必转义特殊字符,除了Jon Skeet的回答中所示的双引号。
它在c#中被称为逐字字符串字面量,只是在字面量之前加上@的问题。这不仅允许多行,而且还关闭了转义。例如,你可以这样做:
string query = @"SELECT foo, bar
FROM table
WHERE name = 'a\b'";
但是,这包括字符串中的换行符(使用源代码中的任何换行符)。对于SQL来说,这不仅无害,而且可能提高了在任何地方看到字符串的可读性——但在其他地方可能不需要它,在这种情况下,您要么不需要使用多行逐字字符串文字开始,要么从结果字符串中删除它们。
唯一的转义是,如果你想要一个双引号,你必须添加一个额外的双引号符号:
string quote = @"Jon said, ""This will work,"" - and it did!";
你可以使用@和""。
string sourse = @"{
""items"":[
{
""itemId"":0,
""name"":""item0""
},
{
""itemId"":1,
""name"":""item1""
}
]
}";
是的,你可以把一个字符串分割成多行,而不需要在实际的字符串中引入换行符,但这并不漂亮:
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++的方法是用反斜杠结束每一行,导致换行符被转义,并且不会出现在输出中。不幸的是,仍然存在第一行之后的每一行必须左对齐的问题,以便不向结果添加额外的空白。
只有一个选项不依赖于可能不会发生的编译器优化,那就是将定义放在一行上。如果你想依赖编译器优化,你已经有+很棒;你不需要左对齐字符串,结果中没有换行符,这只是一个操作,没有函数调用,期望优化。
using System;
namespace Demo {
class Program {
static void Main(string[] args) {
string str = @"Welcome User,
Kindly wait for the image to
load";
Console.WriteLine(str);
}
}
}
输出
Welcome User,
Kindly wait for the image to
load