为啥 C# 为 `using` 定义了两种不同的用法?
Posted
技术标签:
【中文标题】为啥 C# 为 `using` 定义了两种不同的用法?【英文标题】:Why does C# define two different uses for `using`?为什么 C# 为 `using` 定义了两种不同的用法? 【发布时间】:2011-03-10 14:19:25 【问题描述】:更多是出于好奇而提出的问题,但为什么 C# 为关键字 using
定义了两个不同的“目的”?一方面,它是一个指令......
用于创建一个别名 命名空间或导入定义的类型 在其他命名空间中。
另一方面,这是一个声明......
定义一个范围,在这个范围之外 一个或多个对象将被释放。
对我来说,同一个关键字似乎有不同的用途,但也许我遗漏了一些东西。这个关键字有两种不同的用途是有原因的吗?或者,这两个目的,在编译器的深处,真的是一回事吗?
【问题讨论】:
我认为关键字命名团队中的某些人在为两个完全不相关的事物选择同一个词时简直是在放屁 :) 有些关键字用于多个功能。 “where”用于泛型和 LINQ。 你可以有笔记本(电脑)或笔记本(袖珍本)。同一个词——两个不同的意思因上下文而异。这就是语言的运作方式。 有什么问题?不同的作用域有不同的含义。 我很确定using
语句和using
指令是两个不同的东西,但是是的,我想知道为什么没有with
或@987654325 @ 语句,或者可能是 import
或 uses
指令
【参考方案1】:
几年前我在 Eric Lippert 的博客here 上问过同样的问题(见第一条评论)。
他的回答是:
这是语言的一个棘手点 设计;当一个关键字用于 代表两个完全不同的 概念,容易混淆。但 每个概念引入一个新关键字 让语言感觉有点臃肿。 我个人会选择 “imports”或一些这样的语法 指令形式,以确保它是 不与陈述形式混淆, 但我明白这是一个判断 打电话。
我们正在为 C# 4.0 设计一项功能 被剪掉了,这又是一个 “部分”类的形式;基本上,一个 共享属性元数据的方式 在机器生成和 用户生成的部分的一半 班级。我推回使用 该功能的关键字“部分” 因为那时我们会有三个 微妙不同的含义 C# 中的“部分”,我觉得是两个 太多。 (我提倡添加 另一个条件关键字 “现存的”。不幸的是,重点 最终没有实际意义,因为该功能是 因时间不足而删减。)——埃里克
对于那些不知道 Eric 是谁的人来说,他是 C# 编译器团队的开发人员。
【讨论】:
这是对使用该语言做出的一些决定的有趣见解。【参考方案2】:我看不出这两种用法在编译器中是一样的。
我认为双重使用的原因仅仅是关键字非常适合两种用途并且没有歧义的危险(一个是指令,另一个是语句,因此它们出现在完全不同的上下文中)。我认为这很好——一种语言应该有少量的关键字,并且它们的使用应该很容易理解——using
的两种用法都是如此。
正如 Linkgorn 在评论中提到的,同样情况的另一个例子是where
,它也存在于两个地方(通用约束和 LINQ 查询语法)。
【讨论】:
另一个例子是out
关键字,它也可用于声明 C# 4 中接口和委托类型的泛型类型参数的协变【参考方案3】:
首先是它们都符合这个词,而且由于它们不能在相同的上下文中使用,所以它们不能相互混淆。
除了任何措辞偏好之外,原因还在于语言关键字的数量。
关键字与任何库类等都是分开的。我可以创建一个名为 DateTime 的方法,而不会破坏或与 DateTime 类型重叠,因为我可以使用命名空间来指定我想要的。但是你不能*创建一个名为“public”的方法或变量,因为它是一个语言关键字。
正因为如此,大多数语言都力求将关键字的数量保持在最低限度(有些甚至吹嘘使用的关键字很少)。用作关键字的每个英语单词对于程序员来说都无法用于其他用途。如果可能,最好重用现有的关键字,而不是从程序员字典中永久删除另一个页面(特别是如果该语言已被使用,在这种情况下,新关键字会破坏任何使用它作为标识符的代码)
【讨论】:
以上是关于为啥 C# 为 `using` 定义了两种不同的用法?的主要内容,如果未能解决你的问题,请参考以下文章
为啥用于 Unicode 属性测试的 C# System.Char 方法有两个重载?
在C#中Debug和Release两种调试方法出来结果不同,求问为啥?