23

更多的是出于好奇而提出的问题,但为什么 C# 为关键字定义了两个不同的“目的” using?一方面,这是一个指令......

用于为命名空间创建别名或导入在其他命名空间中定义的类型。

另一方面,这是一个声明...

定义一个范围,一个或多个对象将在该范围之外被释放。

对我来说,同一个关键字似乎有不同的用途,但也许我遗漏了一些东西。这个关键字有两种不同的用途是有原因的吗?或者,这两个目的,在编译器的深处,真的是一回事吗?

4

3 回答 3

20

几年前,我在他的博客上向 Eric Lippert 提出了同样的问题见第一条评论)。

他的回应是:

这是语言设计的一个棘手点;当一个关键字用于表示两个完全不同的概念时,可能会造成混淆。但是为每个概念引入一个新的关键字会使语言感觉有点臃肿。我个人会为指令形式选择“导入”或某些此类语法,以确保它不会与语句形式混淆,但我理解这是一个判断调用。

我们正在为 C# 4.0 设计一个功能,该功能被删减,这是另一种形式的“部分”类;基本上,一种在分部类的机器生成的部分和用户生成的部分之间共享属性元数据的方法。我拒绝为该功能使用关键字“partial”,因为在 C# 中,“partial”会有三个微妙不同的含义,我觉得这两个含义太多了。(我主张添加另一个条件关键字“existing”。不幸的是,这一点最终没有实际意义,因为该功能因时间不足而被删除。)——Eric

对于那些不知道 Eric 是谁的人,他是 C# 编译器团队的开发人员。

于 2011-03-10T14:28:16.077 回答
19

我看不出这两种用途在编译器中是如何相同的。

我认为双重使用的原因仅仅是关键字非常适合这两个目的并且没有歧义的危险(一个是指令,另一个是语句,因此它们出现在完全不同的上下文中)。我认为这很好——一种语言应该有少量的关键字,并且它们的使用应该很容易理解——对于using.

正如 Linkgorn 在评论中提到的,同样情况的另一个例子是where它也存在于两个地方(通用约束和 LINQ 查询语法)。

于 2011-03-10T14:22:44.220 回答
3

首先是它们都符合这个词,并且由于它们都不能在相同的上下文中使用,因此它们不能相互混淆。

除了任何措辞偏好之外,原因还在于语言关键字的数量。

关键字与任何库类等分开。我可以创建一个名为 DateTime 的方法,而不会破坏或与 DateTime 类型重叠,因为我可以使用命名空间来指定我想要的。但是你不能*创建一个名为“public”的方法或变量,因为它是一个语言关键字。

正因为如此,大多数语言都力求将关键字的数量保持在最低限度(有些甚至夸耀使用了很少的关键字)。每个用作关键字的英语单词对于程序员来说都无法用于其他用途。如果可能,最好重用现有的关键字,而不是从程序员字典中永久删除另一个页面(特别是如果该语言已被使用,在这种情况下,新关键字将破坏任何使用它作为标识符的代码)

于 2011-03-10T14:36:16.870 回答