【问题标题】:What characters are allowed in C# class name?C# 类名中允许使用哪些字符?
【发布时间】:2009-06-04 13:32:44
【问题描述】:

在 C# 类名中允许使用哪些字符,不允许使用哪些字符?你能帮忙吗?

编辑:指定。允许使用哪些特殊字符?请具体说明,因为指向 50 页高科技语言规范的链接并不是对我有很大帮助的答案。

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

类人@WorkOffice@Helper@Class

{

}

我想到了一种使用某种字符或其他东西的方法,以便能够从这个类名中获取部分 Person、WorkOffice、Helper 和 Class。

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

【问题讨论】:

  • 如果您解释一下您要解决的问题,也许会更好。让某人组成一个对类型名称有效的所有可能字符的列表似乎是不可行的。
  • 类 Person_WorkOffice_Helper_Class { }
  • 我不能使用下划线 Jeremy,因为这些部分可以包含 _。
  • 克里斯,我希望类名尽可能接近这些部分的源名称。
  • 如何使用命名空间而不是试图为你的类命名?

标签: c# class naming-conventions


【解决方案1】:

规格详情为here。从本质上讲,character classesLuLlLtLmLoNlMn、@987654331Mc933 中的任何 unicode 字符(包括 unicode 转义) 、PcCf。第一个字符是一个例外,它必须是一个字母(LuLlLtLmLo 类)或下划线。此外,如果标识符是关键字,则必须在其前面加上一个 @。 @ 是可选的,否则。

【讨论】:

  • 字符类信息在msdn.microsoft.com/en-us/library/20bw873z.aspx。不幸的是,unicode 太大了,如果不参考字符类就给出一个明确的列表是不可行的:(
  • 你是说我只能用字母数字和单下划线吗?
  • @tomaszs 不,他的意思是你可以使用的字符太多了,在这里列出它们是不切实际的。例如,您可以使用重音字符:àéôùÿ...,而且它们有很多。
  • 这似乎有一些例外。例如,我不能声明一个名为 Testˆ 的类 - 尽管最后一个字符 (U+02C6) 属于 Lm 类别
  • 我认为 Visual Studio 使用的编译器不符合这一说法。例如,我不能使用名为“testᴺᵁᴸᴸ”的类进行编译,并得到错误 CS1056:意外字符(顺便说一下,这些字符来自 Lm。)希望海报能清楚说明这一点。
【解决方案2】:

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

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

source

【讨论】:

  • 您能说得更具体些吗?我已经详细说明了我在寻找什么。希望能看到更多帮助。谢谢!
  • 除 @ 或 _ 符号外,不允许使用特殊字符。它必须以字母下划线或@符号开头,然后你就可以开始了。
  • @JeremyCoenen 以@ 开头仅用于转义关键字(@if),但下一个字符必须遵循与第一个字符相同的规则。例如。我无法命名变量 @1abc,因为不允许将数字作为第一个字符。
【解决方案3】:

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.

【讨论】:

    【解决方案4】:

    基于现有答案中分类的字符,您可以使用此扩展方法检查字符:

    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】:

      请注意,正如 thecoop 所指出的,Unicode 上下文中的“字符”一词比字母字母要广泛得多。

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

      举个例子:

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

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

      但请注意,CLS 合规性已被排除在外……但从它的声音来看,您可能并不太担心这一点。

      【讨论】:

      • 如果您将键盘输入从英语切换到希腊语,您可以快速输入希腊字母以用于数学表达式。这:σ=E*ε; 是一个有效的声明。
      【解决方案6】:

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

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

      例如:

      HtmlHelper htmlHelper; 
      FtpTransfer ftpTransfer;
      UIControl uiControl;
      

      【讨论】:

      • 这不能回答问题。
      • 对不起,为什么不呢,@ZzZombo?您检查过表中的char mask 列吗?但是,由于[A-z] != [A-Za-z] 确实掩码不正确。
      • 因为您想出了命名约定,而不是标识符中的有效字符子集。
      • 我明白了,谢谢。在这种情况下,我宁愿参考规范。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 2021-10-18
      • 2010-10-29
      • 1970-01-01
      • 2011-10-30
      相关资源
      最近更新 更多