为什么“ using”指令和“ using”语句在C#中使用相同的关键字?


10

using指令使我们可以访问类型,而无需使用它们的全限定名:

using MyNamespace.Foo.Bar;

using语句充当try/ finally块的语法糖,可确保正确处置对象:

using(var x = new MyDisposableClass()) { ... }

这两种情况似乎彼此无关。他们为什么使用相同的关键字?

我怀疑有人会混淆这两种情况,但是如果不为新功能创建新词似乎很奇怪。


顺便说一句,我也读过classC ++ 的双重用法(一种用于声明类,一种用于定义模板参数),但是第二种情况最终得到了自己的关键字typename,这对我来说更有意义。

Answers:


7

您是对的,因为两者的使用using无关。

但是,using在两种情况下都有几个充分的理由要使用。

  • using语句是为.NET 1.0创建的,具有语义意义(“我在以下代码中使用此名称空间”)
  • 在这两种情况下,using都具有语义意义。用简单的英语来说,您是using一个名称空间或您是using已声明的一次性对象。
  • 通过重载using关键字,语言设计人员不必在该语言中创建另一个保留字。这有助于保持语言清洁。

再次给他们时间,语言设计人员可能会选择使用import名称空间声明来消除这两种选择的歧义(using在.NET的更高版本中使用了可抛弃的对象)。我们永远不会知道,它实际上并不重要,因为由于上下文非常清楚,您正在使用两种含义中的哪一种。

说了这么多,请不要using MyNamespace.DisposableObject = DisposableObject;随处乱扔带有名称空间别名的代码。


谢谢。您能否扩展一下“帮助保持语言整洁”的含义?在我看来,关键字的重载会使语言变得不太干净。我认为创建一个新的关键字并为不同的功能使用单独的关键字会更清洁。
eigenchris '16

5
关键字不能用作标识符。引入新的关键字会破坏碰巧使用该关键字作为标识符的每个程序。如果您可以访问C♯整个历史中曾经编写的每一行源代码,包括专有源代码,秘密源代码,军事源代码等,则只能以向后兼容的方式引入关键字。
约尔格W¯¯米塔格

@JörgWMittag,并非完全正确。C#具有大量上下文关键字,它们的添加方式意味着具有该名称的现有标识符不会与代码冲突。var是经典示例,其中名为的作用域内类型var优先于关键字。
David Arno

@JörgWMittag或替代方法是使编译器的语言版本可选(如g++ --std=c++11,或允许源文件指定方言(如Haskell(?),Racket,Perl甚至Python)。也可以在一种关键字永远不会在不保留某些标识符的情况下与可能的标识符在语法上发生冲突的方式(尽管对于使用LALR解析器和前置词法分析器的现成语言实现而言,这可能是困难的)
2013年

1
@eigenchris,您始终可以在keword之前加一个@,以将其用作标识符,例如@using
BillTür16年

4

语言设计师通常会尝试限制关键字的数量。当保留关键字时,它不能用作用户代码中的标识符,如果只是您需要的单词,这将很烦人。从其他语言移植代码时,这也是一个障碍-微软希望人们将代码从Java移植到C#。C#确实比Java具有更多的关键字,但是每个新关键字都会使其变得更加困难。此外,.net语言旨在与使用不同语言编写的API进行交互,而这些语言可能没有相同的关键字,如果公共成员也是关键字,则会引起麻烦。

的两种用法using是明确的,因为它们出现在语法中的位置,因此“使用”在两种情况下都是合适的术语。因此,重用相同的关键字很有意义。您将注意到其他重复使用关键字的示例,例如:

  • new 在一般约束下
  • inin foreach和in变体类型参数
  • default作为switch操作符(default(T))中的子句和。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.