为什么C#designers对';使用';关键词?

为什么C#designers对';使用';关键词?,c#,language-design,C#,Language Design,使用关键字的有三种不同的含义: 类型/命名空间别名 名称空间导入 用于确保Dispose的语法糖称为 文档调用前两个definitions指令(我猜这意味着它们本质上是预处理的),而最后一个是语句 不管它们是通过语法来区分的,为什么语言开发人员会通过附加三种不同的含义来使关键字的语义复杂化呢?例如,(免责声明:在我的头顶上,肯定有更好的例子)为什么不添加像alias和import这样的关键字呢?技术、理论或历史原因?关键字配额?;-) 人造样品: import System.Timers; al

使用关键字的
有三种不同的含义:

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

    不管它们是通过语法来区分的,为什么语言开发人员会通过附加三种不同的含义来使关键字的语义复杂化呢?例如,(免责声明:在我的头顶上,肯定有更好的例子)为什么不添加像
    alias
    import
    这样的关键字呢?技术、理论或历史原因?关键字配额?;-)

    人造样品:

    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();
        }
      }
    }
    

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

    你的问题假设一个关键词有三个上下文含义,比三个不同含义的关键词复杂。有些人可能对此提出质疑


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

    我认为语言设计师必须使用尽可能少的关键字,以尽量减少名称与标识符的冲突。如果你想象有人从C++或java中移植代码,那么更少的关键字意味着冲突的可能性更小。 这实际上不在您的问题的范围内,但在创建现有语言的新版本时,这个问题尤其重要。C#3增加了上下文关键字,即只有在特定情况下才成为关键字的标识符。只是为了防止现有代码变得无效

    我同意@Judas的观点,即“使用”的三种用法并不令人困惑(IMHO)。我认为,C#已经被错误地指责太像Java。想象一下,如果它有一个“import”关键字,有些人会怎么说…

    埃里克·利珀特(Eric Lippert,我相信他目前在微软的C#团队工作)在他的博客()上发布了一条评论,回答了一个类似的问题。引用他的话:

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


    这是一个愚蠢的决定。我个人会做出你建议的选择:使用“别名”和“导入”之类的词。我注意到“alias”是C#的上下文关键字,用于声明特定文件中使用了外部别名;将其用于声明类型别名而不是“使用”似乎更为自然

    “使用”的陈述形式实际上是在游戏后期添加的;设计者希望使用“using”,不仅是因为它已经是一个关键字,而且还因为它强调某个资源正在某个特定的代码区域中使用,然后就消失了。事实上,“使用”已经具有指导意义,这是一个令人高兴的意外

    如果你对这个话题感兴趣,我已经写了几篇文章。例如,在这里,我有一些关于“fixed”、“partial”和“into”在C#中如何具有多重含义的文章:

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


    我很高兴能够在函数内使用<<代码>使用指令,就像C++一样。我想这是不可能的,正是因为这种二元性。仅供参考,前两个是指令,因为它们不生成任何代码;他们只是更改表的名称。最后一个是语句,因为它会导致生成代码。@Gabe感谢您澄清这一点。与“内部外部动态静态func()”声明不同。完全不同意这必然是主观的。正如我在问题中特别指出的那样,这可能有客观的技术、政治或历史原因。Eric Lippert讲述了他作为微软工程师的经历,他曾和语言设计师一起工作;他的回答客观地基于第一手经验。关于标识符命名冲突的答案是技术性的、客观的和完全有效的。关闭会阻止其他有效的客观答案,并意味着语言设计没有任何逻辑!虽然我个人对“使用”有多种用途和含义没有异议,但我可以看出这对一些人来说是多么的困难。我从未被多重含义所迷惑,但我的工具确实如此。如果我几十年来安装的系统上的所有文本处理工具都可以升级,以理解我使用的所有语言的语法,那将是非常好的,但这似乎不太可能发生。虽然我很欣赏你的意见,但你没有回答这个问题。我的问题不涉及复杂性或混乱。(我不觉得其含义令人困惑或难以辨别。)考虑到你是从一张白板(以及大量的历史和理论)开始一门新语言的,我的问题是,他们为什么决定将三个特征合并为一个关键词?你说你的问题没有假设复杂性,但确实如此。你在帖子中说,“为什么语言开发人员会使关键字的语义复杂化”,这意味着3个上下文含义比3个不同的关键字更复杂。这是有争议的。正如Eric Lippert指出的,“这是一个判断的决定”。对不起,我被纠正了。复杂性不是我好奇心的核心;我认为这是他们决定的副作用,但我可以看出我的措辞如何暗示我认为复杂性是核心问题。再次感谢您的回复。非常有趣的回答。T