如何判斷 string 是否為合法的 C# 變數名?

C# 現在是支持中文變數名的. 那麼比如 Visual Studio, 判斷一個 string 是否可作為變數名的嚴格規則是什麼樣的? 不考慮是否存在同名標籤的情況.


去翻CSharp Language Specification。

本節給出的標識符規則完全符合 Unicode 標準附件 31 推薦的規則,但以下情況除外:允許將下劃線用作初始字元(這是 C 編程語言的傳統),允許在標識符中使用 Unicode 轉義序列,以及允許「@」字元作為前綴以使關鍵字能夠用作標識符。

identifier:
available-identifier
@ identifier-or-keyword

available-identifier:
An identifier-or-keyword that is not a keyword

identifier-or-keyword:
identifier-start-character identifier-part-charactersopt

identifier-start-character:
letter-character
_ (the underscore character U+005F)

identifier-part-characters:
identifier-part-character
identifier-part-characters identifier-part-character

identifier-part-character:
letter-character
decimal-digit-character
connecting-character
combining-character
formatting-character

letter-character:
A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nl
A unicode-escape-sequence representing a character of classes Lu, Ll, Lt, Lm, Lo, or Nl

combining-character:
A Unicode character of classes Mn or Mc
A unicode-escape-sequence representing a character of classes Mn or Mc

decimal-digit-character:
A Unicode character of the class Nd
A unicode-escape-sequence representing a character of the class Nd

connecting-character:
A Unicode character of the class Pc
A unicode-escape-sequence representing a character of the class Pc

formatting-character:
A Unicode character of the class Cf
A unicode-escape-sequence representing a character of the class Cf

有關上面提到的 Unicode 字元類的信息,請參見《Unicode 標準 3.0 版》的第 4.5 節。
有效標識符的示例包括「identifier1」、「_identifier2」和「@if」。
符合規範的程序中的標識符必須遵循由「Unicode 標準化格式 C」(按「Unicode 標準附錄 15」中的定義)定義的規範格式。當遇到非「標準化格式 C」格式的標識符時,怎樣處理它可由 C 的具體實現確定,但是不要求診斷。
使用前綴「@」可以將關鍵字用作標識符,這在與其他編程語言建立介面時很有用。字元 @ 並不是標識符的實際組成部分,因此在其他語言中可能將此標識符視為不帶前綴的正常標識符。帶 @ 前綴的標識符稱作逐字標識符 (verbatim identifier)。允許將 @ 前綴用於非關鍵字的標識符,但是(從代碼書寫樣式的意義上)強烈建議不要這樣做。


正解當然是像 @Ivony 的回答那樣看規範。
抄近路的話可以像 @vczh 的回答那樣用CodeDom造段代碼編譯一下。
想看csc(Roslyn版)的實現的話看這裡:ScanIdentifier()


可以看我寫的簡化版C#編譯器——MiniSharp的詞法分析部分:https://github.com/Ninputer/VBF/blob/master/src/Samples/MiniSharp/MiniSharpParser.cs
主要在第121、138行和171行。這和完整C#規範使用了一樣的的規則,很容易用正則表達式表達。同時也是其它語言希望支持各國語言變數名的良好做法。


調用CodeDom來parse下面的代碼:

using System;

class Fuck&
{
public const string &<你要判斷的內容&> = "bitch";
}


查標準,然後寫個正則就可以了。


嚴格規則就是如果你的變數名不合法,編譯就不會過。


推薦閱讀:

怎麼看待 「C#已經沒落」 這種說法?
哪裡有比較全比較好的 C# 學習資料下載?
上層應用開發是否沒有底層開發有前途?

TAG:C# | 命名規範 | 編程規範 |