可能你不知道的沙雕 C# 寫法(3):字符串也是有語(yǔ)義分析的哦
大家都知道,C# 一共使用多種字符串格式的字面量來(lái)聲明字符串:
普通字符串字面量:
"This is a string."
原義字符串字面量:
內(nèi)插字符串字面量:
$"This is an interpolated string with value {nameof(variable)} = {variable}."
帶內(nèi)插的原義字符串字面量:
$@"String value."
或@$"String value."
原生字符串字面量:
"""This is a raw string literal."""
帶內(nèi)插的原生字符串字面量:
$"""Interpolated string: {nameof(variable)} = {variable}"""
當(dāng)然,這不是在給各位科普字面量格式。今天是給大家說(shuō)一個(gè)特殊的語(yǔ)法識(shí)別規(guī)則。
平時(shí)可能你會(huì)經(jīng)常用到一些別的語(yǔ)言的語(yǔ)法,然后以字符串形式鑲嵌進(jìn) C# 代碼里去的情況。比如說(shuō)我想寫一個(gè) JSON 字符串:
比如這樣的內(nèi)容。但有些時(shí)候,因?yàn)樽址奶厥庑裕皇怯脕?lái)呈現(xiàn)字符的序列用的,所以它不一定會(huì)被編譯器識(shí)別成別的語(yǔ)言,畢竟 C# 編譯器只管 C# 的語(yǔ)法,對(duì)吧。所以,假設(shè)我在里面插入了一些別的字符導(dǎo)致 JSON 字符串不合規(guī)之后,可能就很難被看出來(lái),比如冒號(hào)寫成中文的了。

我在標(biāo)記注釋的地方插入了一個(gè)中文的冒號(hào)。這很難被發(fā)現(xiàn)對(duì)吧。
實(shí)際上,Visual Studio 提供了一個(gè)潛規(guī)則,可以為字符串按照一些特定語(yǔ)言的語(yǔ)法進(jìn)行特殊著色處理,就跟 IDEA 處理 Java 的時(shí)候一樣。但是,Visual Studio 的規(guī)則是這樣的:
你需要在這樣的本地變量(臨時(shí)變量)的上面加上一行注釋:// lang = 語(yǔ)言
舉個(gè)例子。我們?cè)谶@段代碼上加一個(gè) // lang = json
看看:

你就會(huì)發(fā)現(xiàn),Visual Studio 對(duì)這段 JSON 上色了。(雖然有點(diǎn)丑……但是顏色是可以自己在設(shè)置里調(diào)整的,這個(gè)問(wèn)題不大)
你可以看到,在錯(cuò)誤冒號(hào)所在行上,產(chǎn)生了一段警告波浪線。我們將鼠標(biāo)放上去可以發(fā)現(xiàn),Visual Studio 告訴了我們,這段 JSON 是錯(cuò)誤的,因?yàn)槊疤?hào)不合法:

“JSON issue: Property name must be followed by a ':'”,這句話的意思是“JSON 問(wèn)題:屬性名字后面必須跟著一個(gè)‘:’”。注意這個(gè)解釋文字里的冒號(hào)是英語(yǔ)的。
看到了嗎,C# 還有這種操作,神奇不神奇?而且,它對(duì)多種字符串字面量格式都支持。比如最新的原生字符串字面量:

甚至是別的語(yǔ)言,比如正則表達(dá)式(匹配身份證編號(hào)的):

不過(guò),還是有很多不支持的語(yǔ)言的代碼,比如 Markdown 啊、SQL 等等。但是我相信,Visual Studio 已經(jīng)在著手開(kāi)始完成對(duì)這些語(yǔ)法著色進(jìn)行實(shí)現(xiàn)了。相信不久以后,Visual Studio 會(huì)對(duì)這些東西支持得越來(lái)越多、越來(lái)越好。