【问题标题】:Why is the C# 5.0 await keyword listed as an operator rather than a modifier?为什么 C# 5.0 await 关键字被列为运算符而不是修饰符?
【发布时间】:2012-07-31 17:41:24
【问题描述】:

MSDN 库lists the await keyword as an operator。这对我来说似乎很奇怪——我以为它是一个修饰符,比如the async keyword。

为什么这是一个运算符?

【问题讨论】:

  • 因为它改变了返回类型?我的意思是从Task 到预期的类型。
  • await 只能在异步方法调用的上下文中使用,而不是在方法声明的上下文中使用,这与 async 不同。推测它是一个运算符,因为它对返回值做了一些事情。
  • 实际上,Jon Galloway 向社区提出这个问题,听起来就像是一位老师在测试他的 class=)
  • @AndreCalil 不,我真的不知道而且很好奇。
  • @JonGalloway 开个玩笑。你有一个很好的答案,我相信。我坚持认为它是一个运算符,因为它修改了数据类型。我知道它的作用远不止于此,但这是一种概念行为,IMO。

标签: c# async-await c#-5.0


【解决方案1】:

async 是声明的修饰符。类似于public。

await 是一个使用异步运算符并对其进行处理的操作。类似于return。

await 不会修改其后放置的内容,而是指定如何处理该操作。相比之下,async 实际上并没有修改任何东西,它只是标志着一个特定的方法是 async 的风格(它是最终的 await 执行从语法结构对方法结构的所有更改观点)。

【讨论】:

  • 我想 “做某事”是将异步任务结果转换为预期的类型。 +1
  • @AndreCalil:如果我没记错的话,它还允许编译器将底层函数转换为多个函数,以支持适当的延续传递样式。有什么比说起来容易吗?
  • 我明白了。但我相信最能将其识别为操作符的是能够改变数据类型,就像>、==等等。
  • 你的意思是说它“使用异步方法”吗?
  • @AndreCalil:?? 是一个不改变数据类型的运算符示例。
【解决方案2】:

修饰符适用于声明。 private、static、out、ref、params、override 关键字就是这样的例子。和异步。

运算符应用于表达式并转换表达式结果。您在 await 右侧写的内容称为“await 表达式”。因此它是一个酉算子。

【讨论】:

    【解决方案3】:

    好的,我相信我们都同意它是一个运营商。我一直在说,将它定义为运算符的关键概念是它更改了结果数据类型,但这并不完全正确。

    我们看一下运算符的定义:

    C# 提供了大量运算符,它们是指定 在表达式中执行哪些操作

    来源:MSDN

    所以,正如 Guvante 所指出的,我们确实有一个由type identifier = await asyncMethod() 表示的表达式(你知道,大部分都喜欢它)。而await 确实对这个表达式执行了操作。它处理等待和从TaskResult 到预期类型的​​转换,等等。

    正如我所说,我同意其他 2 个答案(Guvante 和 Hans Passant),我只是认为这个小概念也可以提供帮助。

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      相关资源
      最近更新 更多