更多的问题出于好奇而不是任何事情,但为什么C#为关键字using
定义了两个不同的“目的”?一方面,这是一个指令...
用于为a创建别名 命名空间或导入类型定义 在其他名称空间中。
另一方面,这是一个陈述......
定义范围,在其范围之外 将丢弃一个或多个物体。
对我而言,对于相同的关键字似乎有不同的用途,但也许我错过了一些东西。这个关键字有两个不同的用途吗?或者,这两个目的,在编译器的腹部深处,真的是一样的吗?
答案 0 :(得分:20)
几年前我在他的博客上问过Eric Lippert同样的问题here(见第一条评论)。
他的回答是:
这是一个棘手的语言点 设计;当一个关键字用于 代表两个完全不同的 概念,它可能会令人困惑。但 为每个概念引入一个新关键字 使语言感觉有点臃肿。 我本人会选择的 “导入”或一些这样的语法 指令形式,以确保它 不要与声明表格混淆 但我明白这是一个判断 调用
我们正在为C#4.0设计一个功能 被削减了又是另一个 形式的“部分”阶级;基本上,a 共享属性元数据的方法 机器生成和之间 用户生成的一半部分 类。我推迟了使用 该功能的关键字“部分” 因为我们会有三个 微妙的不同含义 C#中的“部分”,我觉得是两个 太多。 (我主张补充 另一个条件关键字 “现有”。不幸的是,重点 从功能开始就结束了 因缺乏时间而减少。) - Eric
对于那些不知道Eric是谁的人,他是C#编译团队的开发人员。
答案 1 :(得分:19)
我无法看到这两种用法在编译器中是如何相同的。
我认为双重使用的原因只是关键字非常适合这两个目的,并且没有歧义的危险(一个是指令,另一个是语句,因此它们出现在完全不同的上下文中) )。我认为这非常好 - 一种语言应该包含少量关键字,并且它们的用法应该易于理解 - 对using
的两种用法都是如此。
正如Linkgorn在评论中提到的,同样情况的另一个例子是where
,它也存在于两个地方(泛型约束和LINQ查询语法)。
答案 2 :(得分:3)
首先,他们两个都适合这个词,因为它们都不能在同一个环境中使用,所以不能相互混淆。
除了任何措辞偏好之外,原因是语言关键字的数量。
关键字与任何库类等分开。我可以创建一个名为DateTime的方法,而不会破坏或重叠DateTime类型,因为我可以使用命名空间来指定我想要的那个。但是你不能*创建一个名为“public”的方法或变量,因为它是一个语言关键字。
因此,大多数语言都试图将关键字的数量保持在最低限度(有些甚至夸耀关键字的使用次数)。用作关键字的英语的每个单词对于程序员来说都不可用于其他用途。如果可能,最好重用现有的关键字,而不是从程序员字典中永久删除另一个页面(特别是如果已经使用了该语言,在这种情况下,新关键字将破坏任何使用它作为标识符的代码)