为什么C#定义了两种不同的`using`用法?

23
只是出于好奇,为什么 C# 为关键字 using 定义了两个不同的“用途”?一方面,它是一个指示符,用于创建命名空间的别名或导入其他命名空间中定义的类型。

另一方面,它是一个语句,用来定义作用域,在该作用域之外,一个对象或多个对象将被处理掉。

对我来说,这似乎是同一个关键字的不同用途,但也许我漏掉了什么。 这个关键字采取两种不同用途的原因是什么?或者,从编译器的深处来看,这两个目的实际上是相同的吗?

2
我认为关键字命名团队中的某个人在选择两个完全不相关的事物时,只是脑子一抽 :) - Hector Correa
3
有一些关键词被用于多个功能。"where" 既用于泛型,也用于 LINQ。 - Linkgoron
2
你可以有笔记本电脑或者笔记本便携式电子阅读器。同一个单词在不同的上下文中具有不同的意义,这就是语言运作的方式。 - Lukasz Madon
2
什么问题?不同的范围有不同的含义。 - Tokk
1
我非常确定using语句和using指令是两个不同的东西,但是我想知道为什么没有一个withuse语句,或者一个importuses指令。 - SWeko
显示剩余8条评论
3个回答

20

几年前我在Eric Lippert的博客上问了同样的问题,链接在这里(见第一条评论)

他的回答是:

这是语言设计中一个棘手的问题;当一个关键字用于表示两个完全不同的概念时,会令人困惑。但是为每个概念引入一个新的关键字会使语言感觉有点臃肿。我个人会选择“imports”或类似的语法来确保指令形式不会与语句形式混淆,但我理解这是一个判断性的决定。

我们正在为C# 4.0设计一个被取消的功能,它是“partial”类的另一种形式;基本上是一种在部分类的机器生成和用户生成的部分之间共享属性元数据的方法。我反对在该功能中使用关键字“partial”,因为我们将在C#中有三个微妙不同的含义,我认为这太多了。(我主张添加另一个条件关键字“existing”。不幸的是,由于时间不足,该功能最终被取消了。)-- Eric

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


1
这是关于语言决策的一些有趣见解。 - David Hoerster

19

我无法看出这两种用法在编译器中如何是同一件事情。

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

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


另一个例子是 out 关键字,它也可用于在 C# 4 中声明泛型类型参数的协变性,适用于接口和委托类型。 - BrokenGlass

3

首先,它们两个词都适合使用,但由于它们不能在同一上下文中使用,因此它们不会被混淆。

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

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

因此,大多数语言都试图将关键字数量保持最少(有些甚至夸耀使用了很少的关键字)。英语语言中每个用作关键字的单词都将无法供程序员进行其他用途。如果可能的话,最好重复使用现有关键字,而不是永久删除程序员字典中的另一页(特别是如果该语言已经被使用,在这种情况下,新关键字将打破使用其作为标识符的任何代码)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接