C# 三重双引号(三个双引号)

And*_*rei 19 c# string format

"""C# 中三重双引号的用途是什么?它似乎用于多行文本。但为什么不使用单双引号呢@"..."

string text = """
  some text
  some text
  some text
  """;
Run Code Online (Sandbox Code Playgroud)

Dmi*_*nko 25

我认为一个简单的例子比许多文字更能解释。假设我们有一个 SQL 查询,我们希望保持良好的格式以便于阅读。

如果我们天真地说,它不会编译:

string sql = 
  "select id, 
          name
     from MyTable"; // <- Doesn't compile 
Run Code Online (Sandbox Code Playgroud)

我们可以使用现在@可以编译的逐字字符串

string sql = 
 @"select id, 
          name
     from MyTable"; 

...

// A little bit different format somewhere else in c# code
string sameSql = @"select id, 
                          name
                     from MyTable"; 
Run Code Online (Sandbox Code Playgroud)

但又出现了另一个问题:我们有不同的字符串,这就是为什么 RDBMS 会将它们视为不同的查询,两个版本都将被解析和优化,放入缓存等。因此,我们多次完成相同的工作(甚至更糟糕:解析查询缓存可能会被不同格式的相同查询淹没,并且没有足够的空间用于其他查询)。

sql我们有

select id, 
          name
     from MyTable
Run Code Online (Sandbox Code Playgroud)

我们sameSql有相同的查询,但格式不同:

select id, 
                          name
                     from MyTable
Run Code Online (Sandbox Code Playgroud)

请注意,前导空格被保留(我们使用了逐字字符串,对吗?),这是一个问题。

解决方案是使用新"""结构

string sql = 
 """
    select id, 
           name
      from MyTable
 """; 

...

// A little bit different format
string sameSql = """
                    select id, 
                           name
                      from MyTable
                 """; 

Run Code Online (Sandbox Code Playgroud)

在这两种情况下我们都会得到相同的文本

select id, 
       name
  from MyTable
Run Code Online (Sandbox Code Playgroud)

查询将被解析、优化并放入缓存一次,C# 代码风格被忽略


And*_*rei 16

来源:C# 11 预览更新 \xe2\x80\x93 原始字符串文字

\n
\n

如果您使用包含引号或嵌入\n语言字符串(如 JSON、XML、HTML、SQL、Regex 等)的字符串文字,则原始\n文字字符串可能是您最喜欢的 C# 11 功能。以前,如果\n您复制了带引号的文字字符串转换为 C# 文字时,字符串在第一个双引号处结束并出现编译器错误,直到转义每个双引号为止。同样,如果您将带有大括号的文本复制到插值字符串文字中,则每个大括号都会被解释为嵌套代码表达式的开头,除非您将其转义,通常是通过加倍大括号来进行转义。

\n

原始字符串文字没有转义。例如,反斜杠\n作为反斜杠输出,\n\\t作为反斜杠输出t,\n不作为制表符输出。

\n

原始字符串文字至少以三个双引号开始和结束\n( """...""")。在这些双引号内,单引号"被视为\n内容并包含在字符串中。任何数量小于打开原始字符串文字数量的双引号都被视为内容。因此,在三个双引号打开原始字符串文字的常见情况下,两个双引号一起出现将只是内容。如果需要输出三个或更多双引号的序列,只需使用比该序列至少多一个引号来打开和关闭原始字符串文字即可。

\n

可以通过在原始字符串文字前面添加 来对其进行插值$。\n$字符串前缀的数量是指示嵌套代码表达式所需的大括号数量。这意味着 a 的$行为类似于现有的字符串插值 xe2x80x93 a 一组大括号表示嵌套代码。如果原始字符串文字以 为前缀$$,则单个大括号将被视为内容,并且需要两个大括号来指示嵌套代码。就像\n与引号一样,您可以添加更多内容$以允许更多的花括号\n被视为内容。例如:

\n
const int veryCold = -30;\nconst int comfortable = 20;\n\nstring jsonString =\n  $$"""\n  {\n    "TemperatureRanges": {\n      "Cold": {\n        "High": {{comfortable}},\n        "Low": {{veryCold}}\n      }\n    }\n  }\n  """;\n
Run Code Online (Sandbox Code Playgroud)\n

原始字符串文字还具有根据前导空格自动\n确定内容缩进的新行为。要了解有关此内容的更多信息并查看有关此功能的更多示例,请查看文档文章原始字符串文字

\n
\n

PS感谢RoeProgrammingLlama指出本文。

\n