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

Tom*_*ski 61 c# class naming-conventions

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

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

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

class Person @ WorkOffice @ Helper @ Class

{

}

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

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

the*_*oop 67

规格细节在这里.基本上,字符类 Lu,Ll,Lt,Lm,Lo,N1,Mn,Mc,Nd,PcCf中的任何unicode字符(包括unicode转义).第一个字符是一个例外,它必须是一个字母(Lu,Ll,Lt,LmLo类)或下划线.此外,如果标识符是关键字,则必须在其前面加上@.否则,@是可选的.

  • @tomaszs不,他的意思是你可以使用很多字符,所以在这里列出它们是不切实际的.例如,你可以使用重音字符:`àéôùÿ...`,并且它们中有很多. (7认同)
  • 似乎有一些例外.例如,我不能声明一个名为`Test`的类 - 尽管最后一个字符(`U + 02C6`)属于Lm类别 (6认同)
  • 字符类信息位于http://msdn.microsoft.com/en-us/library/20bw873z.aspx.不幸的是,unicode是如此之大,如果没有引用字符类,给出一个明确的列表是不可行的:( (5认同)
  • 你想说我只能使用字母和数字和单下划线吗? (2认同)
  • 我认为 Visual Studio 使用的编译器不符合此声明。例如,我无法使用名为“testᴺᵁᴸᴸ”的类进行编译,并得到错误 CS1056:意外字符(顺便说一下,这些字符来自 Lm。)希望能从海报中清楚了解这一点。 (2认同)
  • 此答案中提到的字符类是:Lu =“字母,大写”。Ll =“字母,小写”。Lt =“字母,标题”。Lm =“字母,修饰符”。Lo =“信件,其他”。Nl =“数字,字母”。Mn =“标记,无间距”。Mc =“标记,间距组合”。Nd =“数字,十进制数字”。Pc =“标点符号,连接符”。Cf =“其他,格式”。 (2认同)

Jer*_*nen 24

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

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

资源

  • 如果参考无效:https://web.archive.org/web/20130315082540/http://blog.visualt4.com/2009/02/creating-valid-c-identifiers.html (2认同)

asg*_*las 14

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

从那里你可以从组中挑选大多数东西(从规范,其他人也正确指出):

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
{

}
Run Code Online (Sandbox Code Playgroud)

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

编辑:请注意,规范说它允许Unicode 3.0中的字符.我忽略了这一点,并想知道为什么很多人物都不会工作,尽管他们来自正确的群体.查看此问题了解详情.


tha*_*rgy 7

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)