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

时间:2009-06-04 13:32:44

标签: c# class naming-conventions

允许哪些字符以及C#类名称中不允许的内容?你能帮忙吗?

编辑:指定。允许哪些特殊字符?请具体说明,因为高技术语言的50页规格链接不是一个对我有帮助的答案。

解释:我试图完成的是将类名划分为可区分的部分,例如:

  

类Person @ WorkOffice @ Helper @ Class

     

{

     

}

我想到了一种使用某种角色或其他东西来从这个类名中获取Part,WorkOffice,Helper和Class的方法。

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

6 个答案:

答案 0 :(得分:61)

规范详情为here。基本上,character classes LuLlLtLmLo,{{3}中的任何unicode字符(包括unicode转义) },NlMnMcNdPc。第一个字符是一个例外,它必须是一个字母(类CfLuLlLtLm)或下划线。此外,如果标识符是关键字,则必须在其前面加上@。否则,@是可选的。

答案 1 :(得分:23)

C#中的有效标识符在C# Language Specification第9.4.2项中定义。规则很简单:

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

source

答案 2 :(得分:13)

可在此处找到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 Person〱WorkOffice〱Helper〱Class
{

}

我不是说我建议使用奇怪的字符。但对于特殊场合,这似乎是:)

编辑:请注意,规范说它允许Unicode 3.0 中的字符。我忽略了这一点,并想知道为什么很多人物都不会工作,尽管他们来自正确的群体。 Check this question for details

答案 3 :(得分:3)

请注意,正如thecoop所指出的,Unicode语境中的术语“字符”比字母字母宽泛得多。

基本上,很多Unicode symbols可以在标识符中有效使用,即使它们在Windows中可能有点tough to type

举个例子:

  • 按住ALT键
  • 在键盘上输入“0394”
  • 发布ALT

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

但请注意,CLS合规性已经消失了......但是听到它的声音,你可能不会太在意它。

答案 4 :(得分: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;
        }
    }

答案 5 :(得分:0)

这是一篇您可能会有所帮助的文章:C# Coding Standards and Naming Conventions

table

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

例如:

HtmlHelper htmlHelper; 
FtpTransfer ftpTransfer;
UIControl uiControl;