允许哪些字符以及C#类名称中不允许的内容?你能帮忙吗?
编辑:指定。允许哪些特殊字符?请具体说明,因为高技术语言的50页规格链接不是一个对我有帮助的答案。
解释:我试图完成的是将类名划分为可区分的部分,例如:
类Person @ WorkOffice @ Helper @ Class
{
}
我想到了一种使用某种角色或其他东西来从这个类名中获取Part,WorkOffice,Helper和Class的方法。
是的,我知道这很疯狂,但我需要这样。我知道我可以使用属性和反射来将这些数据存储在类meta中,但事实并非如此,所以请不要建议这个解决方案。
答案 0 :(得分:61)
规范详情为here。基本上,character classes Lu,Ll,Lt,Lm,Lo,{{3}中的任何unicode字符(包括unicode转义) },Nl,Mn,Mc,Nd和Pc。第一个字符是一个例外,它必须是一个字母(类Cf,Lu,Ll,Lt或Lm)或下划线。此外,如果标识符是关键字,则必须在其前面加上@。否则,@是可选的。
答案 1 :(得分:23)
C#中的有效标识符在C# Language Specification第9.4.2项中定义。规则很简单:
答案 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。
举个例子:
将为您的代码添加一个希腊大写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
简而言之,通常,对象的第一个单词/部分/字母是小写,而类的首词/部分/字母是大写。
例如:
HtmlHelper htmlHelper;
FtpTransfer ftpTransfer;
UIControl uiControl;