为什么用C ++ / Java和类似的美元符号启动变量名称是不好的?

为什么用C ++ / Java中的美元符号和类似的PHP开始变量名称是不好的?

编辑:有风险吗?

在C ++中,它是不可移植的。 标准所说的唯一字符(section [lex.name] )必须是可接受的才能开始标识符是大写和小写字母和下划线。

在Java中,使用$ in变量是合法的,但绝对是个坏主意。

如果这样做,您可能会意外地使用与编译器本身或某些代码生成器使用的名称冲突的名称。 结果将是意外的编译或运行时故障,可能特别难以诊断…

您(错误地)使用$将导致未来版本的Java出现问题,这也是一个潜在的风险。 Java编译器/运行时对$的使用可能在将来发生变化,导致滥用代码失败。

只是不要这样做。 或者至少,除非你正在编写一个发电机,否则不要这样做…… 而且你知道自己在做什么

Java允许美元符号开始标识符,但建议它仅用于机械生成的代码。 (见这里 )

似乎在C ++标识符中可以使用美元符号作为扩展名,但它不是标准的一部分。

在Java中,$用于内部类名,也可能是一些“合成”方法名。 基本上,编译器必须生成的用于处理内部类的任何代码都将包含$。 使用$ will,至少会因此而令人困惑。 一般来说,您应该永远不需要在Java中看到变量/方法/类名中的$。

对于这篇文章中的 java

但是,惯例是始终用字母开头,而不是“ $ ”或“ _ ”。 此外,按照惯例,美元符号字符根本不会被使用。 您可能会发现某些情况,其中自动生成的名称将包含美元符号,但您的变量名称应始终避免使用它。 对于下划线字符存在类似的约定; 虽然用“ _ ”开始变量的名称在技术上是合法的,但不鼓励这种做法。

我认为没有任何风险/副作用; 它只是气馁。

因为在C ++和Java中都会出现语法错误(在C ++的情况下)或错误的样式(在Java的情况下)。 这些语言都不需要如此指示变量,这样做是错误的。 使用特殊字符(如’$’)启动变量会使语言系统变得更容易(这对于像PHP这样的解释语言非常重要),但对于程序员来说,生活会变得更加困难,因为他们必须输入所有这些’ $’字符。 因此大多数语言(甚至大多数解释语言)都不需要它们。

我能想到的主要原因就在这里。 在Java中,内部类名称是使用$ sign创建的。 此外,$ sign用于大多数Oses中的env变量,因此会混淆并可能干预系统定义的变量。

因为JLS 8 3.8这样说:

$符号应仅用于机械生成的源代码,或者很少用于访问旧系统上的预先存在的名称。

而且您可以真正生成无法编译的代码,例如在Oracle JDK 1.8.0_45上:

 public class Assert { static final boolean $assertionsDisabled = false; public static void main(String[] args) { assert System.currentTimeMillis() == 0L; } } 

问题是javac生成一个字段$assertionsDisabled来实现assert ,这与我们的字段冲突。

另见: https : //stackoverflow.com/a/29439538/895245