有一个简单的方法来创建一个多行字符串文字在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";

使用此方法时,您也不必转义特殊字符,除了Jon Skeet的回答中所示的双引号。

其他回答

你可以在字符串前面使用@符号来形成一个逐字逐句的字符串字面量:

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

使用此方法时,您也不必转义特殊字符,除了Jon Skeet的回答中所示的双引号。

我发现使用字符串文字的问题是,它会让你的代码看起来有点“奇怪”,因为为了在字符串本身中不获得空格,它必须完全左对齐:

    var someString = @"The
quick
brown
fox...";

讨厌的东西。

因此,我喜欢使用的解决方案是:

var someString = String.Join(
    Environment.NewLine,
    "The",
    "quick",
    "brown",
    "fox...");

当然,如果您只是想在逻辑上拆分SQL语句的行,而实际上并不需要新的行,那么您总是可以替换Environment。换行" "。

在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 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++的方法是用反斜杠结束每一行,导致换行符被转义,并且不会出现在输出中。不幸的是,仍然存在第一行之后的每一行必须左对齐的问题,以便不向结果添加额外的空白。

只有一个选项不依赖于可能不会发生的编译器优化,那就是将定义放在一行上。如果你想依赖编译器优化,你已经有+很棒;你不需要左对齐字符串,结果中没有换行符,这只是一个操作,没有函数调用,期望优化。

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

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