C#中的多行字符串文字
在C#中,这被称为“verbatim string literal”,只需要在字符串前面加上@即可。这不仅允许多行,还关闭了转义。例如,您可以这样做:
string query = @"SELECT foo, bar FROM table WHERE name = 'a\b'";
这将包括换行符(使用源代码中的任何换行符)在字符串中。对于SQL来说,这不仅是无害的,而且可能提高了在任何看到该字符串的地方的可读性 - 但在其他地方可能不需要,这种情况下,您要么不使用多行verbatim字符串文字,要么从结果字符串中删除它们。
唯一需要转义的是,如果您想要一个双引号,您必须添加一个额外的双引号符号:
string quote = @"Jon said, ""This will work,"" - and it did!";
这个答案是错误的;它引入了OP不想要的换行符。
我将在答案中增加一些关于这一点的内容 - 当OP写问题时,这一点并不清楚。
在C#中,可以使用@
符号在string
前面形成多行字符串字面量:
string query = @"SELECT foo, bar FROM table WHERE id = 42";
使用这种方法时,除了在Jon Skeet的答案中显示的双引号外,你不需要转义特殊字符。
如果你的字符串包含双引号("),你可以像这样转义它们:" "(这是两个双引号字符)。
"是否有一种方法可以在不创建新行的情况下实现上述效果?我有一段非常长的文本,我希望在IDE中能够看到它换行而不必使用加号("hi " + "there")。
- 实际上没有,但你可以使用上面weiqure的方法来解决这个问题:@"my string".Replace(Environment.NewLine, "")
。
MonoDevelop-Unity在这里出现了问题。
@
实际上使得C#对待字符串字面量的方式就像VB对待字符串字面量一样。
那么如何结合@
和新的C#运算符$
呢?
你可以使用$@"text"。
下面是一个XML字符串的示例,请注意双引号:schemas.xmlsoap.org/soap/envelope
和tempuri.org/OrderEntry.Xsd:
@"<soapenv:Envelope xmlns:soapenv=""schemas.xmlsoap.org/soap/envelope"" xmlns:ord=""tempuri.org/OrderEntry.Xsd""> <soapenv:Header></soapenv:Header>"
这个回答是错误的。你的查询字符串最终包含了换行符,这不是问题的要求。我相信正确的答案是"不,你不能在C#中这样做"。请参见Carco Loco的答案。他的"这是我现在的做法"应该消除了对他意图的任何疑问。
在C++中,你可以在每行的末尾加上反斜杠来实现一个不包含换行符的字符串字面量,其定义跨越多行。这正是我认为OP所问的。
C# 6.0引入的一个新特性是将插值字符串与多行字符串文本结合使用。多行字符串文本的写法是在字符串前加上$@,然后将字符串用双引号包裹起来。这样可以方便地在字符串中插入变量。
下面是一个示例代码:
string camlCondition = $@""; {(string)parameter}
通过这种方式,可以在字符串中插入变量,并且保持字符串的格式不变。这在处理大段的XML或HTML代码时非常有用。
这个特性的出现原因是为了提高代码的可读性和可维护性。在以往的版本中,如果要在字符串中插入变量,需要使用字符串连接符加上变量的值。这样的写法不仅冗长,而且容易出错。而使用多行字符串文本,可以直接在字符串中使用变量,使代码更加简洁明了。
如果要在多行字符串文本中插入大括号,需要使用两个大括号来表示。例如:
$@"{{example literal text { fooString }. }}"
这是因为C#中的Angular、React和Vue.js等框架使用的是相反的约定,可能会引起一些混淆。
另外,如果插值字符串中的变量调用了方法,例如:
{date.ToString("yyyy-mm-dd")}
可以考虑使用_i的方式来插入变量,这样插值的方式更加简洁,不需要处理双引号的问题。
总之,C# 6.0引入了多行字符串文本的特性,可以方便地在字符串中插入变量,并且保持字符串的格式不变。这个特性在处理大段的XML或HTML代码时非常有用,可以提高代码的可读性和可维护性。同时,需要注意在多行字符串文本中插入大括号时需要使用两个大括号来表示。