C#类名称中允许使用哪些字符?


68

C#类名称中允许哪些字符,哪些不允许?能否请你帮忙?

编辑:指定。允许使用哪些特殊字符?请具体说明,因为以高科技语言链接到50页规范并不能为我带来很大帮助。

说明:我试图完成的工作是将类名划分为不同的部分,例如:

类Person @ WorkOffice @ Helper @ Class

{

}

而且,我考虑了一种使用某种字符或其他方式从该类名中获取Person,WorkOffice,Helper和Class的方法。

是的,我知道这很疯狂,但是我需要那样。我知道我可以使用属性和反射将这些数据存储在类meta中,但是事实并非如此,因此请不要建议这种解决方案。


1
如果您解释了要解决的问题,也许会更好。某人组成对类型名称有效的所有可能字符的列表似乎不可行。
Andrew Hare

3
class Person_WorkOffice_Helper_Class {}
杰里米·

1
我不能使用下划线Jeremy,因为这些部分中可以包含_。
Tomasz Smykowski 09年

1
克里斯,我希望有一个尽可能接近这些部分源名称的类名称。
Tomasz Smykowski 09年

50
关于使用名称空间而不是尝试为类命名的方式呢?
Raoul Supercopter

Answers:


70

规格详细信息在这里。本质上,字符类 LuLlLtLmLoNlMnMcNdPcCf中的任何unicode字符(包括unicode转义)。第一个字符是一个例外,它必须是字母(类LuLlLtLmLo)或下划线。另外,如果标识符是关键字,则必须在其前面加上@。@是可选的,否则。


5
字符类信息位于msdn.microsoft.com/zh-cn/library/20bw873z.aspx。不幸的是,unicode是如此之大,以至于没有给出字符类就给出一个明确的列表是不可行的:(
thecoop

1
您是否想说我只能使用字母,数字和下划线?
Tomasz Smykowski 09年

7
@tomaszs不,他的意思是您可以使用太多的字符,以至于无法在此处列出所有字符。例如,您可以使用带重音的字符:àéôùÿ...,其中有很多。
苏珊·杜彭(SuzanneDupéron)2013年

7
似乎有一些例外。例如,Testˆ尽管最后一个字符(U+02C6)位于Lm类别中,但我无法声明一个名为的类
fostandy 2015年

1
我认为Visual Studio使用的编译器不符合此要求。例如,我无法使用名为“testᴺᵁᴸᴸ”的类进行编译,并获得错误CS1056:意外字符(顺便说一下,这些字符来自Lm。)对此,发帖人会很清楚。
TernaryTopiary

26

C#中的有效标识符在C#语言规范的9.4.2中定义。规则很简单:

  • 标识符必须以字母或下划线开头
  • 第一个字符后,可以包含数字,字母,连接符等
  • 如果标识符是关键字,则必须在其前面加上“ @”

资源


你可以再详细一点吗?我已经详细询问了我要寻找的东西。希望看到更多的帮助。谢谢!
Tomasz Smykowski 09年

除@或_符号外,不允许使用任何特殊字符。它必须以字母下划线或@符号开头,然后您就可以开始了。
杰里米·科嫩2009年

@JeremyCoenen以“。”开头@只是用于转义关键字(@if),但下一个字符必须遵循相同的规则。例如,我不能命名变量@1abc,因为不允许将数字用作第一个字符。
Teejay


17

Unicode类别可在以下位置找到:http : //www.dpawson.co.uk/xsl/rev2/UnicodeCategories.html

从那里,您可以从组中选择大多数东西(从specs中,其他人也已正确指出):

Lu,Ll,Lt,Lm,Lo,Nl,Mn,Mc,Nd,Pc,Cf

但是请注意,Visual Studio(或者说Resharper)不一定会全部喜欢它们,但是它们大多数都可以编译。以字符30FB KATAKANA MIDDLE DOT为例。它可以很好地编译,但是在IDE中不能很好地运行。但是,这种用于垂直波浪形低线的奇怪的FE34演示表效果很好。

这是一个运行良好的分隔符:

class PersonWorkOfficeHelperClass
{

}

我并不是说我建议您使用奇怪的字符。但是在特殊情况下,这似乎是:)

编辑:请注意,规范说它允许Unicode 3.0中的字符。我忽略了这一点,并想知道为什么许多角色虽然来自正确的群体却不起作用。请查看此问题以获取详细信息


3

请注意,如coop所示,Unicode上下文中的“字符”一词比仅字母字母宽很多。

基本上,即使在Windows中很难键入,许多Unicode符号也可以有效地用于标识符中。

举个例子:

  • 按住ALT键
  • 在键盘上输入“ 0394”
  • 释放ALT

将在代码中添加希腊大写字母Delta ...就C#而言,这是一个有效的标识符字母。

但是请注意,CLS遵从性已经消失了……但是听起来,您可能还是不太担心。


2
如果您将键盘输入从英语切换为希腊语,则可以快速输入希腊字母以用于数学表达式。这σ=E*ε;是有效的声明。
John Alexiou 2012年

1
您不必键入'+'
Teejay

3

根据以上答案中分类的字符,您可以使用以下扩展方法检查字符:

    public static bool IsValidInIdentifier(this char c, bool firstChar = true)
    {
        switch (char.GetUnicodeCategory(c))
        {
            case UnicodeCategory.UppercaseLetter:
            case UnicodeCategory.LowercaseLetter:
            case UnicodeCategory.TitlecaseLetter:
            case UnicodeCategory.ModifierLetter:
            case UnicodeCategory.OtherLetter:
                // Always allowed in C# identifiers
                return true;

            case UnicodeCategory.LetterNumber:
            case UnicodeCategory.NonSpacingMark:
            case UnicodeCategory.SpacingCombiningMark:
            case UnicodeCategory.DecimalDigitNumber:
            case UnicodeCategory.ConnectorPunctuation:
            case UnicodeCategory.Format:
                // Only allowed after first char
                return !firstChar;
            default:
                return false;
        }
    }

1

这是您可能会有所帮助的文章:C#编码标准和命名约定

表

简而言之,通常,对象的第一个单词/部分/字母是小写,而类的是大写

例如:

HtmlHelper htmlHelper; 
FtpTransfer ftpTransfer;
UIControl uiControl;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.