在C#中,int
或string
等标识符实际上是语言级关键字
这是什么原因?
请注意,如果作者想要禁止使用这些名称的用户类型,那可能会导致语义错误,而不是语法错误。
基于答案的一些澄清:
它们是关键字,因为它使解析成为可能/更容易
我不明白为什么,因为我正在开发一个解析器,Type.Rule = Identifier
比Type.Rule = Identifier | "int" | "string" | ...
简单得多。
它们是关键字,因为它们是特殊的别名
var
和dynamic
也是特殊的东西,但不是关键字(出于兼容性原因,它表明作为关键字不必是特殊的)。在另一个示例中,将[Serializable]
应用于类型会生成魔法IL元数据修饰符serializable
,而不是标准自定义属性。但它仍然不是关键词。
它们是关键字,因为它们是其他语言的关键字
很好的答案,但是,为什么他们的关键字在其他语言?此外,当然可以用蓝色突出显示它们而不用它们作为关键字,那么为什么要用其他语言来引用呢?
答案 0 :(得分:3)
据我所知,C#设计人员希望允许典型的类型名称,就像它们在C风格的语言中一样,即string
,int
等等。同时,这些类型中的每一种都必须具有完全限定的类型名称,例如System.String
和System.Int32
。因此,决定为这些常用类型提供别名。
如果我再次找到此声明的来源,我会添加链接。
在其他基于CLI的语言中,相同的完全限定类型标识符有效。但是,int
或string
等类型名称在这些语言中可能不常见,因此可能会提供其他别名。
使用类型别名的一个可能的优点可能是提高可读性,这就是为什么有StyleCop rule强制使用别名而不是常规类型名称的原因。关于简洁性的观点也在this thread中提到同一主题。
答案 1 :(得分:3)
我学到的语言几乎是这样的:C,C ++,Java,Pascal,C#。我不太确定,但根据班级Compiler Design
,我在大学学习过(在这门课程中,我们将学习人们如何编写编译器,一步一步,并实现自己的编译器),这是你的主要原因。问题是:为了更容易词汇分析短语
编码时,所有代码只需 AN 简单字符串。在编译之前,编译器必须做很多短语。
例如,当您键入:
时 int a = 5;
第一个短语是Lexical Analysis必须提供如下字典并发送到 Parser pharse :
int ---> identifiers
a ---> Variable
= ---> Operator(=)
5 ---> Integer
; ---> ;
Lexical Analysis
如何知道这一点:首先,它将构建一个字典表并搜索您输入的字符串。当第一个标记生成器遇到时,它将停止并获取该标记生成器。 (这很重要!)
这样的字典:
if ---> if
then ---> then
int ---> int
.... // all keywords here
[a-z][a-z0-9_]* ---> variable // example of regular expression : I don't sure it's true, just something like this :D
因此,如果语言允许您将int命名为变量。如:
int int = 5;
lexical analysis
的上述方法已损坏,当它读取第二个int
时,它不知道它是变量或关键字,并且必须有更复杂的步骤确定它。
我不是说它不能,但它在编译时更复杂,更慢,并且不需要。对程序员说简单:“嘿,不要那么做,或者,我不会编译你的程序:))”
希望这有用:)
答案 2 :(得分:1)
这是因为int
和C#语言中内置的其他特殊值类型根本不是真正的类型,而是aliases of the .NET Framework System types。
这是语法错误而不是语义错误的原因仅仅是因为在语法错误检测阶段检测到错误,这发生在语义错误检测阶段之前。语法错误检测具有确定int
是用作类型还是其他内容所需的所有信息。假设我们有以下规则:
declaration = type identifier ;
语法阶段检查标识符是否是[a-Z]([a-Z] + | [0-9] +)+并且不是保留关键字或别名,在您描述它的情况下。因此,将此命名为语法错误是完全合理的。