在C#源代码中使用特殊字符是否错误,例如"ñ"?

Rub*_*zzo 26 .net c# coding-style visual-studio-2010 visual-studio

最近,使用C#,我只是使用拉丁字符声明了一个方法参数ñ,我尝试构建(编译)我的整个解决方案并且它有效,因此我能够执行我的程序.但我很想知道在用C#编写的源代码中使用拉丁字符等特殊字符是否错误?如果是错的,为什么?

除了用英文编写代码更清晰,更通用之外,还有其他理由不在C#源代码中使用特殊字符吗?

Eri*_*ert 24

让我把它分解成几个问题.

根据规范在C#标识符,字符串等中使用非罗马字母是合法的吗?

是的,一点没错.Unicode规范将其归类为字母的任何字符都是合法的.有关详细信息,请参阅规范.

有关C#程序中非罗马字母的技术问题吗?

是的,有一些.您可能已经意识到,您可以"静态地"和"动态地"将代码链接到应用程序中,并且编译器是一个应用程序.过去我们遇到过编译器有一个静态链接的旧版Unicode分类算法的问题,编辑器有一个动态链接的当前版本,现在编辑器和编译器可能不同意什么是一封法律信件,可能会引起用户混淆.但是,你提到的重音拉丁字符已经在Unicode标准中,只要它们不太可能引起任何问题.

而且,很多人仍然使用老式的编辑; 我学会了如何在20世纪80年代后期在WATCOM编程,我仍然经常使用WATCOM VI作为我的编辑.我有时可以在Visual Studio中编写更快的代码,因为经过23年的练习,我的手指才非常擅长.(虽然现在几乎所有东西都使用Visual Studio.)显然,1980年代编写的编辑器会遇到Unicode问题.

关于C#程序中的非罗马字母是否存在任何非技术问题?

显然,是的.我个人宁愿使用希腊字母作为泛型类型参数,例如:

class List<?> : IEnumerable<?>
Run Code Online (Sandbox Code Playgroud)

或者在实施数学代码时:

degrees = 180.0 * radians / ?;
Run Code Online (Sandbox Code Playgroud)

但是我不喜欢顺从我的同事,他们并不特别想切割和粘贴,或者学习神秘的组合键,只是为了编辑我的代码.

  • 我非常喜欢您使用希腊字母表示泛型类型参数和数学相关表达式的想法. (5认同)

Ste*_*eve 6

根据评论添加了第一位:

这不能回答这个问题...... OP不是在问它是否被允许(显然是这样),而是它是否错了--Thomas Levesque

好的,让我直接解决它:

在用C#编写的源代码中使用拉丁字符等特殊字符是错误的吗?如果是错的,为什么?

根据规范的定义,它不是"错误的"(见下文).

除了用英文编写代码更清晰,更通用之外,还有其他理由不在C#源代码中使用特殊字符吗?

既然你说"除了",我就不会解决易读性和"普遍性"主题(无论如何都适用于StackOverflow问题).对于你的另一部分:"还有其他理由不使用特殊字符"......因为我忽略了你提到的第一件事,我不得不说我想不到很多.我唯一能想到的是; 我们仍然(令人惊讶地)在今天支持Unicode的一些工具(大多数是非品牌的第三方工具)存在问题,可能是你使用了一些不能正确处理unicode或者不正确地符合C#规范的古怪工具 - 但我没有遇到任何问题.所以,我会说不.(请记住,您明确表示我不必解决易读性或普遍性问题).


来自C#ECMA规范第70页:

本子条款中给出的标识符规则完全符合Unicode标准附件15推荐的规则,但允许下划线作为初始字符(在C编程语言中是传统的),标识符中允许使用Unicode转义序列," @"允许使用字符作为前缀,以使关键字可用作标识符.

identifier:: 
    available-identifier
    @ identifier-or-keyword

available-identifier::
    An identifier-or-keyword that is not a keyword

identifier-or-keyword::
    identifier-start-character 
    identifier-part-charactersopt

identifier-start-character:: 
    letter-character
    _ (the underscore character U+005F)

identifier-part-characters::
    identifier-part-character
    identifier-part-characters
    identifier-part-character

identifier-part-character:: 
    letter-character
    decimal-digit-character 
    connecting-character 
    combining-character 
    formatting-character

letter-character::
    A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nl
    A unicode-escape-sequence representing a character of classes Lu, Ll, Lt, Lm, Lo, or Nl
Run Code Online (Sandbox Code Playgroud)

重要的一点是规范定义的内容letter-character.

它具体包括: A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nl

您提到的字符(ñunicodereference)属于类别"Lu"(字母,大写),标识符中的规范特别允许.

  • 这没有回答这个问题...... OP并没有问是否允许(显然是这样),但这是否是错误的 (3认同)
  • @ThomasLevesque请看我的编辑.此外,我们可能不同意这里的条款.在我的字典中,"错误"具有非常特殊的含义 - 而这种含义通常不属于普遍意见.此外,OP特别要求的答案忽略了可读性等主题. (2认同)

Jon*_*nna 5

在家里玩耍时,我经常会给Func参数命名,?因为这样做很让我感到高兴.

对于任何人都会看到的代码,我不会让某人有更难的打字工作只是因为它让我在给定的情况下使用非拉丁字母.那不是这种娱乐的地方.

有一个完全正常的拉丁字母ñ,如果我有充分的理由使用它所使用的贷款字,我就没有使用它的疑虑.那就是说,它永远不会出现.现在唯一的贷款字用变音我在编码使用过的外观,但它已经这么久在计算环境中使用,因此人们常常看到的形式门面,我认为的门面作为衍生计算字从外观几乎相同的方式,我认为的颜色作为计算字的颜色,尽管后者是英文的形式我用用拼写,因此永远只能使用外观颜色的书面英语.