[英]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# 代碼風格被忽略。
如果您使用包含引號或嵌入語言字符串的字符串文字,例如 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感謝Roe和ProgrammingLlama指向這篇文章。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.