有一个简单的方法来创建一个多行字符串文字在c# ?

这是我现在拥有的:

string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";

我知道PHP

<<<BLOCK

BLOCK;

c#有类似的东西吗?


当前回答

在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和更多!

其他回答

在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和更多!

它在c#中被称为逐字字符串字面量,只是在字面量之前加上@的问题。这不仅允许多行,而且还关闭了转义。例如,你可以这样做:

string query = @"SELECT foo, bar
FROM table
WHERE name = 'a\b'";

但是,这包括字符串中的换行符(使用源代码中的任何换行符)。对于SQL来说,这不仅无害,而且可能提高了在任何地方看到字符串的可读性——但在其他地方可能不需要它,在这种情况下,您要么不需要使用多行逐字字符串文字开始,要么从结果字符串中删除它们。

唯一的转义是,如果你想要一个双引号,你必须添加一个额外的双引号符号:

string quote = @"Jon said, ""This will work,"" - and it did!";

另一个需要注意的问题是在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 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";

附带说明一下,在c# 6.0中,你现在可以将插值字符串与逐字字符串字面值结合起来:

string camlCondition = $@"
<Where>
    <Contains>
        <FieldRef Name='Resource'/>
        <Value Type='Text'>{(string)parameter}</Value>
    </Contains>
</Where>";