C#11之原始字串

2022-11-14 12:11:25

最近.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#還得加油呀!!!