可能你不知道的沙雕 C# 写法(3):字符串也是有语义分析的哦
大家都知道,C# 一共使用多种字符串格式的字面量来声明字符串:
普通字符串字面量:
"This is a string."
原义字符串字面量:
内插字符串字面量:
$"This is an interpolated string with value {nameof(variable)} = {variable}."
带内插的原义字符串字面量:
$@"String value."
或@$"String value."
原生字符串字面量:
"""This is a raw string literal."""
带内插的原生字符串字面量:
$"""Interpolated string: {nameof(variable)} = {variable}"""
当然,这不是在给各位科普字面量格式。今天是给大家说一个特殊的语法识别规则。
平时可能你会经常用到一些别的语言的语法,然后以字符串形式镶嵌进 C# 代码里去的情况。比如说我想写一个 JSON 字符串:
比如这样的内容。但有些时候,因为字符串的特殊性,它只是用来呈现字符的序列用的,所以它不一定会被编译器识别成别的语言,毕竟 C# 编译器只管 C# 的语法,对吧。所以,假设我在里面插入了一些别的字符导致 JSON 字符串不合规之后,可能就很难被看出来,比如冒号写成中文的了。

我在标记注释的地方插入了一个中文的冒号。这很难被发现对吧。
实际上,Visual Studio 提供了一个潜规则,可以为字符串按照一些特定语言的语法进行特殊着色处理,就跟 IDEA 处理 Java 的时候一样。但是,Visual Studio 的规则是这样的:
你需要在这样的本地变量(临时变量)的上面加上一行注释:// lang = 语言
举个例子。我们在这段代码上加一个 // lang = json
看看:

你就会发现,Visual Studio 对这段 JSON 上色了。(虽然有点丑……但是颜色是可以自己在设置里调整的,这个问题不大)
你可以看到,在错误冒号所在行上,产生了一段警告波浪线。我们将鼠标放上去可以发现,Visual Studio 告诉了我们,这段 JSON 是错误的,因为冒号不合法:

“JSON issue: Property name must be followed by a ':'”,这句话的意思是“JSON 问题:属性名字后面必须跟着一个‘:’”。注意这个解释文字里的冒号是英语的。
看到了吗,C# 还有这种操作,神奇不神奇?而且,它对多种字符串字面量格式都支持。比如最新的原生字符串字面量:

甚至是别的语言,比如正则表达式(匹配身份证编号的):

不过,还是有很多不支持的语言的代码,比如 Markdown 啊、SQL 等等。但是我相信,Visual Studio 已经在着手开始完成对这些语法着色进行实现了。相信不久以后,Visual Studio 会对这些东西支持得越来越多、越来越好。