首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在异步方法中返回值的要求

在异步方法中返回值的要求
EN

Stack Overflow用户
提问于 2022-08-24 18:09:08
回答 3查看 46关注 0票数 0

我一直认为,如果一个方法应该返回一个值,那么如果方法主体不返回一个值,程序就不会编译。对于带有异步关键字的方法,情况并非如此。我认为异步关键字允许身体中的方法有一个等待表达式。但是它也允许方法的主体在返回值上吐口水。

我是否正确地理解带有异步关键字的方法是关于强制返回值的规则的一个例外?

代码语言:javascript
运行
AI代码解释
复制
Task MyMethod1() //Error CS0161 'MyMethod1()': not all code paths return a value
{
   
}

async Task MyMethod2() //Do not care
{
   
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-08-24 18:17:57

你说得对,这是个例外。voidasync Task方法都具有有效的void返回类型,并且不需要return语句。这是在语言规范中指定的

(强调地雷)

如果返回类型为void,或者方法为async,返回类型为System.Threading.Tasks.Task,则方法的有效返回类型为System.Threading.Tasks.Task。否则,非异步方法的有效返回类型是其返回类型,具有返回类型的async方法的有效返回类型为T。 如果方法的有效返回类型为void,且该方法具有块体,则块中的返回语句(§12.10.5)不应指定表达式。如果void方法块的执行正常完成(即控制流从方法主体的末尾流出),则该方法只返回其调用方.。 当方法的有效返回类型不是无效且该方法有块体时,该方法正文中的每个返回语句都应指定一个隐式可转换为有效返回类型的表达式。不能访问值返回方法的方法主体的端点。

然后直觉地思考,即使他们想要设计它,以便您必须返回Task的一个实例,您会返回什么Task?没有什么是有意义的返回!异步方法返回的任务应该表示它执行的异步操作。

实际上,一些编译器神奇地将方法体中的代码转换为Task,并使您的方法返回该代码。另见:异步在C#中是如何工作的?

票数 2
EN

Stack Overflow用户

发布于 2022-08-24 18:52:22

async / await关键字在C#编译器中触发了大量魔术。以“简单”为例;

代码语言:javascript
运行
AI代码解释
复制
async Task MyMethod2()
{
   Console.WriteLine("Before");
   await Task.Delay(1000);
   Console.WriteLine("After");
}

编译器的目标是重写您的方法,这样它就可以在每个await上暂停,然后再继续。它将方法移动到新类型,使用实例字段跟踪方法暂停的位置,以及任何局部变量的值。这样你就可以假装你的方法更接近了;

代码语言:javascript
运行
AI代码解释
复制
void MyMethod2()
{
   Console.WriteLine("Before");
   var task = Task.Delay(1000);
   if (!task.IsCompleted) {
      ... pause / resume magic ...
   }
   Console.WriteLine("After");
}

您可以通过反编译器看到所有血淋淋的细节。

票数 0
EN

Stack Overflow用户

发布于 2022-08-24 18:54:05

不不例外。可以捕获返回的Task对象并将其用作任何其他返回值。

代码语言:javascript
运行
AI代码解释
复制
async Task F1Async() 
{
   await Task.Delay(TimeSpan.FromMilliseconds(200));  
}

async Task F2Async() 
{
   Task t1 = F1Async(); 

   // Do other things if you wish here.

   await t1;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73481176

复制
相关文章
JavaScript和jQuery添加和删除class类名
element.classList.remove("className") :删除类名
德顺
2019/11/13
2.8K0
JavaScript - 测试 jQuery
为了引用某个库,请使用 <script> 标签,其 src 属性设置为库的 URL:
陈不成i
2021/07/21
6150
javascript和jQuery修改a标签的href属性
a 标签的 href 属性值如何修改,下面分享一下使用 javascript 或 jQuery 的实现方法。  JavaScript: document.getElementById("myId").setAttribute("href","www.xxx.com");  document.getElementById("myId").href = "www.xxx.com"; jQuery: $("#myId").attr("href","www.xxx.com");
德顺
2019/11/13
4.6K0
jquery对象和javascript对象相互转换
本文转载:http://jeiofw.blog.51cto.com/3319919/786506
跟着阿笨一起玩NET
2018/09/19
4650
JavaScript、Jquery获取屏幕的宽度和高度
在日常的项目中经常需要获取屏幕的宽度或者高度,简单记录一下: Javascript方法获取: document.body.clientWidth //网页可见区域宽 document.body.clientHeight //网页可见区域高 document.body.offsetWidth //网页可见区域宽(包括边线的宽) document.body.offsetHeight //网页可见区域高(包括边线的高) document.body.scrollWidth //网页正文全文宽 document.b
德顺
2019/11/13
5.4K0
JavaScript强化教程——jQuery - 获得内容和属性
本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 —— jQuery - 获得内容和属性
IMWeb前端团队
2019/12/04
7150
JavaScript强化教程——jQuery - 获得内容和属性
本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 —— jQuery - 获得内容和属性。文章介绍了 jQuery 拥有可操作 HTML 元素和属性的强大方法,以及使用 jQuery 的 DOM 操作、获取内容、获取属性等方法。
IMWeb前端团队
2018/01/08
9730
JavaScript(19)jQuery HTML 获取和设置内容和属性
jQuery HTML jQuery 拥有可操作 HTML 元素和属性的强慷慨法。
全栈程序员站长
2022/07/12
1.4K0
JavaScript|jQuery基础语法
jQuery 是一个 JavaScript 库,它极大地简化了 JavaScript 编程。jQuery是一个轻量级的"写的少,做的多"的JavaScript库。
算法与编程之美
2020/07/28
8020
JavaScript|jQuery基础语法
JavaScript 框架学习(JQuery)
参考: http://www.w3cschool.cc/jquery/jquery-tutorial.html
lpe234
2020/07/28
7.8K0
jquery调用javascript方法
本来想找个“优雅”一点的方法,类似C#在调用C++方法时候的Invoke之类的。没找到,后来想想,其实也没必要,直接写就好了,算最优雅了吧。只是少了VS的Intelligence,有点不习惯罢了。
_淡定_
2018/08/24
1.7K0
JavaScript进阶内容——jQuery
我们在前面的文章中已经掌握了JavaScript的全部内容,现在让我们了解一下JavaScript库
秋落雨微凉
2022/10/25
5.5K0
JavaScript进阶内容——jQuery
jQuery 事件绑定 和 JavaScript 原生事件绑定
jQuery 中提供了四种事件监听绑定方式,分别是 bind、live、delegate、on,
Krry
2018/09/10
5.8K0
jQuery 事件绑定 和 JavaScript 原生事件绑定
JavaScript 动画_jquery 动画
回调函数原理:函数可以作为一个参数。将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数,这个过程叫做回调。
全栈程序员站长
2022/11/04
2.4K0
JavaScript 学习-36.jQuery 获取和修改HTML
前言 jQuery 可以获取和修改HTML元素的属性和文本内容 text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) attr() - 获取或设置属性 val() - 设置或返回表单字段的值 获取文本 text() 和 html() text()是获取文本内容,html()返回所选元素的内容(包括 HTML 标记) <h3>获取html内容</h3> <div id="demo"> <p class="text-info">hello w
上海-悠悠
2022/05/31
8080
JavaScript 学习-36.jQuery 获取和修改HTML
JavaScript 学习-40.jQuery 绑定事件 on 和 bind
前言 jquery 有四种绑定事件的方式:on, bind, delegate,live。其中 live() 方法已被移除。 自 jQuery 版本 1.7 起,on() 方法是 bind()、live() 和 delegate() 方法的新的替代。 $(selector).off(type)为元素解除绑定的事件 on 绑定事件 基本语法 $(selector).on(event,childSelector,data,function) 参数 描述 event 必需。事件的类型一个或多个,由空格分隔多个事件
上海-悠悠
2022/06/07
1K0
JavaScript 学习-40.jQuery 绑定事件 on 和 bind
jQuery VS JavaScript原生API
如今技术日新月异,各类框架库也是层次不穷。即便当年漫山红遍的JQuery(让开发者write less, do more,So Perfect!!)如今也有被替代的大势。但JS原生API写法依旧;并且有时候只不过小写一个Demo,或者产品中只有少量的前端效果或DOM操作,就去花时间&空间引入jQuery,或者React?不免有取宰牛之刀以杀鸡之嫌。 在jQuery的温柔乡里,是否还能记得原生她javascript原生?如果仅为使用个选择器($)或者类似的东西,是否真的有必要加载jQuery?故此了解下JS常
晚晴幽草轩轩主
2018/03/27
1.6K0
JavaScript强化教程——jQuery 核心
本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 —— jQuety
IMWeb前端团队
2019/12/04
1.1K0
javaScript和jQuery获取、设置textarea标签的内容(取值和赋值)
通过 element.value 和 element.innerHTML 获取, .value 亲测有效。
德顺
2019/11/13
14.3K0
JavaScript与jQuery获取元素的宽、高和位置
今天汇总整理了 JavaScript 和 jQuery 获取元素宽高和位置的方法,比较全面,方便自己和需要并搜到此文章的朋友们查看。
德顺
2019/11/13
3.1K0

相似问题

混合使用javascript和jquery

10

Onchange是javascript和jquery代码的混合。

11

常规JavaScript可以和jQuery混合使用吗?

41

混合javascript,jQuery和PHP,换行符

10

将javascript与jquery混合

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文