簡體   English   中英

C# 三重雙引號(三個雙引號)

[英]C# triple double quotes (three double quotes)

C#中三重雙引號"""的作用是什么?似乎用於多行文本。但為什么不使用單雙引號?例如:

string text = """
  some text
  some text
  some text
  """;

我認為一個簡單的例子可以比許多文本更好地解釋。 假設我們有一個 sql 查詢,我們希望保持良好的格式以便於閱讀。

如果我們天真地說,它不會編譯:

string sql = 
  "select id, 
          name
     from MyTable"; // <- Doesn't compile 

我們可以使用@來獲得現在可以編譯的逐字字符串

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

...

// A little bit different format somewhere else in c# code
string sameSql = @"select id, 
                          name
                     from MyTable"; 

但是另一個問題出現了:我們有不同的字符串,這就是為什么 RDBMS 將它們視為不同的查詢,兩個版本都將被解析和優化,放入緩存等。所以我們多次完成相同的工作(甚至更糟:解析查詢緩存可能會被不同格式的相同查詢淹沒,並且沒有足夠的空間用於其他查詢)。

sql我們有

select id, 
          name
     from MyTable

sameSql我們有相同的查詢,但格式不同:

select id, 
                          name
                     from MyTable

請注意,前導空格被保留(我們使用逐字字符串,對嗎?),這是一個問題。

解決方案是使用新的"""構造

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

...

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

在這兩種情況下,我們都會得到相同的文本

select id, 
       name
  from MyTable

查詢將被解析、優化並放入緩存一次, c# 代碼風格被忽略

來源: C# 11 預覽更新 – 原始字符串文字

如果您使用包含引號或嵌入語言字符串的字符串文字,例如 JSON、XML、HTML、SQL、正則表達式等,原始文字字符串可能是您最喜歡的 C# 11 功能。字面上,字符串以第一個雙引號結尾,並帶有編譯器錯誤,直到您對每個雙引號進行轉義。 類似地,如果您將帶有大括號的文本復制到一個內插字符串文字中,則每個大括號都被解釋為嵌套代碼表達式的開頭,除非您將其轉義,通常是將大括號加倍。

原始字符串文字沒有 escaping。例如,反斜杠是 output 作為反斜杠, \t是 output 作為反斜杠和t而不是制表符。

原始字符串文字以至少三個雙引號 ( """...""" ) 開頭和結尾。 在這些雙引號中,單個"被視為內容並包含在字符串中。任何數量小於打開原始字符串文字的雙引號都被視為內容。因此,在打開原始字符串的三個雙引號的常見情況下如果您需要 output 一個包含三個或更多雙引號的序列,只需打開和關閉原始字符串文字,並且至少比該序列多一個引號。

可以通過在它們前面加上$來插入原始字符串文字。 字符串前面的$的數量是指示嵌套代碼表達式所需的大括號的數量。 這意味着$的行為類似於現有的字符串插值 - 一組大括號表示嵌套代碼。 如果原始字符串文字以$$為前綴,則將單個大括號視為內容,並且需要兩個大括號來指示嵌套代碼。 就像引號一樣,您可以添加更多$以允許將更多大括號視為內容。 例如:

 const int veryCold = -30; const int comfortable = 20; string jsonString = $$""" { "TemperatureRanges": { "Cold": { "High": {{comfortable}}, "Low": {{veryCold}} } } } """;

原始字符串文字也有新的行為,可以根據前導空格自動確定內容的縮進。 要了解有關此功能的更多信息並查看有關此功能的更多示例,請查看文檔文章 Raw String Literals

PS感謝RoeProgrammingLlama指向這篇文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM