最近.NET7.0和C#11相繼釋出,筆者也是第一時間就用上了C#11,其中C#11的有一個更新能解決困擾我多年的問題,也就是文章的標題原始字串。
在使用C#11的原始字串時,發現的一些有意思的東西,超出了我原本對它的期待,話不多說,我們一起來看看。
我不知道大家有沒有寫過這樣的程式碼,在單元測試裡面我需要建立一個JSON字串,比如像下面這樣的:
{
"FareRules": ["1", "2"],
"CabinLevels": ["2", "3"],
"AirlineSuppliers": [{
"AirlineCode": "MF",
"SupplierIds": ["123456", "345632", "898495"]
}]
}
然後變成C#程式碼我們就需要這樣,為所有的"
新增一個斜槓,作為跳脫字元:
如果這樣子看的不直觀,我們想要多行表示,那需要這樣,把一個"
,變為兩個""
,然後才能輸出:
不過這些有IDE在,設定一下可以自動做轉換,不過像沒有程式碼層級還好,像下面這種情況簡直就是要弄死強迫症,直接就輸出了一些無用的空格。
在JSON這個場景沒啥大問題,但是如果你寫的是SQL,那每次和資料庫伺服器互動時,都會把這些無用的空格傳遞過去。所以不得不寫成下面這樣突兀的程式碼,把縮排全都給刪除:
有了原始字串以後,一切都美好了起來,實現第一個需求,我們只需要首位新增"""
即可:
多行文字也不在話下,而且它以"""
開始的那一列為準,不會輸出多餘的空格:
注意開頭的"""
和結尾的"""
必須是單獨佔用一行,否則就會報錯:
另外,也貼心的給我們做了字串校驗,如果某一行沒有和開頭的"""
在同一列,那麼會給出異常提示:
那麼有小夥伴就要問了,現在是字串裡面包含一個"
符號可以解決,那假設我有一個地方包含兩個"
呢?這也很簡單,只需要往前面再加"
就可以了。如果要輸出大於兩個雙引號,那麼在原始字串定義上加一個雙引號即可,這是非常聰明的做法:
另外原始字串也支援字串插值,比如下面的JSON,如果直接使用$
,那麼會報錯,因為字串內插的格式就是$"ABC {變數} ABC"
,內插的字元需要使用括號包起來,但是JSON已經把括號使用了:
聰明的你肯定想到了,是不是多加一個$
,變成兩個$$
就行了呢?確實是這樣的,在原來的基礎上加多少$
符號就決定了裡面能有多少個相鄰的{
:
同樣,我們想多輸出幾個{
也是一樣的道理,我就想把這一塊JSON用{{
括起來,還想用字串內插就像下面這樣做就可以了:
C#終於解決了這個多年壓死強迫症的困擾,以前用JS的時候還會羨慕有"```"識別符號,可以多行文字直接用,而且還不用寫跳脫,而引以為豪的語法糖居然沒有這個功能。
現在咱們也用上了,不過還有很多Rust、TypeScript的語法特性值得C#學習,C#還得加油呀!!!