为什么C#设计师在'using'关键字中附加了三种不同的含义?

时间:2010-05-06 20:30:54

标签: c# language-design

using关键字有三个不同的含义:

  1. 类型/命名空间别名
  2. 名称空间导入
  3. 用于确保Dispose的语法糖被称为
  4. 文档调用前两个定义指令(我猜这意味着它们本质上是预处理的),而最后一个是语句

    无论它们的语法是否有区别,为什么语言开发人员会通过附加三个不同的含义来复杂化关键字的语义?例如,(免责声明:在我的头顶,可能肯定有更好的例子)为什么不添加aliasimport等关键字?技术,理论或历史原因?关键字配额? ; - )

    受控样本:

    import System.Timers;
    alias LiteTimer=System.Threading.Timer;
    alias WinForms=System.Windows.Forms;
    
    public class Sample {
      public void Action() {
        var elapsed = false;
        using(var t = new LiteTimer.Timer(_ => elapsed = true) {
          while (!elapsed) CallSomeFinickyApi();
        }
      }
    }
    

    “使用”是一个模糊的词。

4 个答案:

答案 0 :(得分:18)

您的问题假设1个关键字的3个上下文含义比具有不同含义的3个不同关键字更复杂。有些人可能会对此提出异议。

在我多年的C#编码中,我不能说我曾经对“使用”的含义感到困惑;从上下文来看,它总是很清楚。

答案 1 :(得分:13)

这是一个jugdment电话。我个人会做出你建议的选择:使用“别名”和“导入”之类的东西。我注意到“alias”是C#的上下文关键字,用于声明在特定文件中使用extern别名;使用它来声明类型别名而不是“使用”似乎更自然。

“使用”的声明形式实际上在游戏中添加得相当晚;设计师希望使用“使用”不仅因为它已经是一个关键字,而且因为它强调资源正在特定的代码区域中使用,然后就会消失。 “使用”已经在指令意义上具有意义的事实是一个快乐的事故。

如果这个话题让你感兴趣,我已经写过几篇文章。这里举例说明我有关于“固定”,“部分”和“进入”在C#中也有多重含义的文章:

http://blogs.msdn.com/ericlippert/archive/tags/What_2700_s+The+Difference_3F00_/default.aspx

另一个答案也链接到我的文章,讨论我们如何确保该语言不会保留太多单词:

http://ericlippert.com/2009/05/11/reserved-and-contextual-keywords/

答案 2 :(得分:7)

我认为语言设计者被迫使用尽可能少的关键字,以尽量减少与标识符的名称冲突。如果你想象有人从C ++或Java移植代码,那么较少的关键字意味着冲突的可能性较小。

这不在您的问题范围内,但在创建现有语言的新版本时,此问题尤其重要。 C#3添加了上下文关键字,即仅在特定情况下使用时才成为关键字的标识符。只是为了防止现有代码变得无效。

我同意@Judas的说法,“使用”的三种用法并不令人困惑(恕我直言)。 C#已经 - 我错误地认为 - 被指责为过于像Java一样。想象一下,如果有一个'import'关键字,有些人会说的话......

答案 3 :(得分:7)

Eric Lippert(我相信他目前在微软的C#团队工作)在他的博客(first comment)上发表评论回复了类似的问题。引用他:

  

这是一个棘手的语言点   设计;当一个关键字用于   代表两个完全不同的   概念,它可能会令人困惑。但   为每个概念引入一个新关键字   使语言感觉有点臃肿。   我本人会选择的   “导入”或一些这样的语法   指令形式,以确保它   不要与声明表格混淆   但我明白这是一个判断   调用