首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >统一C#嵌套IEnumerator

统一C#嵌套IEnumerator
EN

Stack Overflow用户
提问于 2019-10-17 07:34:14
回答 2查看 668关注 0票数 2

在我的代码中,我有嵌套的IEnumerator方法,如下所示:

代码语言:javascript
运行
AI代码解释
复制
    private IEnumerator PerformRequest(string url) {

        // Doing stuff

        UnityWebRequest request = UnityWebRequest.Get(url);
        yield return request.SendWebRequest();

        // Doing stuff
    }

    private IEnumerator PerformRequest2(string url) {

        // Doing stuff

        return PerformRequest(url);

        // Doing stuff
    }

    public IEnumerator PerformRequest3(string url) {

        // Doing stuff

        return PerformRequest2(url);

        // Doing stuff
    }

我想知道,如果在高级方法中添加yield,有什么区别,例如:

代码语言:javascript
运行
AI代码解释
复制
    private IEnumerator PerformRequest(string url) {

        // Doing stuff

        UnityWebRequest request = UnityWebRequest.Get(url);
        yield return request.SendWebRequest();

        // Doing stuff
    }

    private IEnumerator PerformRequest2(string url) {

        // Doing stuff

        yield return PerformRequest(url);

        // Doing stuff
    }

    public IEnumerator PerformRequest3(string url) {

        // Doing stuff

        yield return PerformRequest2(url);

        // Doing stuff
    }

有什么不同吗,还是同样的行为?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-17 07:59:00

当然,这很管用

我自己也做过类似的事情,您完全可以使用yield方法,因为执行是完全线性的,当PerformRequest产生并返回一些值( web请求,但实际上并不重要)时,这些值会传播到PerformRequest2中的yield return...,然后传播到PerformRequest3。统一会在正确的位置恢复执行(你也可以通过测试来回答你自己的问题;)

它基本上与任何其他嵌套函数相同,例如

代码语言:javascript
运行
AI代码解释
复制
int GetValue() {
    return 4;
}

int GetValue2() {
    return GetValue();
}

执行的完全相同(只是使用不同的类型):

代码语言:javascript
运行
AI代码解释
复制
IEnumerator GetValue() {
    return new SomeIEnumerator();
}

IEnumerator GetValue2() {
    return GetValue();
}

(yield只是一个特殊的关键字,它不影响返回类型!):

代码语言:javascript
运行
AI代码解释
复制
IEnumerator GetValue() {
    yield return new SomeIEnumerator();
}

IEnumerator GetValue2() {
    yield return GetValue();
}

你也可以这样做,但我通常认为它没有任何价值:

代码语言:javascript
运行
AI代码解释
复制
IEnumerator GetValue() {
    yield return new SomeIEnumerator();
}

IEnumerator GetValue2() {
    //other stuff, with yield so our function still returns a value
    StarCoroutine(GetValue());
    //this stuff runs without waiting
}

Adassko还发现了关于coroutines和嵌套coroutines的这个伟大的教程

票数 4
EN

Stack Overflow用户

发布于 2019-10-17 08:47:13

值得注意的是,在Draco18s的回答中,这是:

代码语言:javascript
运行
AI代码解释
复制
IEnumerator GetValue() {
    // This line won't work.
    yield return new SomeIEnumerator();
}

IEnumerator GetValue2() {
    //other stuff, with yield so our function still returns a value
    StarCoroutine(GetValue());
    //this stuff runs without waiting
}

不起作用,因为您需要在StartCoroutine调用中生成嵌套的协同线,所以它需要:

代码语言:javascript
运行
AI代码解释
复制
IEnumerator GetValue() {
    // The corrected line.
    yield return StartCoroutine(SomeIEnumerator());
}

IEnumerator GetValue2() {
    //other stuff, with yield so our function still returns a value
    StarCoroutine(GetValue());
    //this stuff runs without waiting
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58436172

复制
相关文章
C# Repeater嵌套循环[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159112.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/14
1.1K0
C# 绘制PDF嵌套表格
嵌套表格,即在一张表格中的特定单元格中再插入一个或者多个表格,使用嵌套表格的优点在于能够让内容的布局更加合理,同时也方便程序套用。下面的示例中,将介绍如何通过C#编程来演示如何插入嵌套表格到PDF文档。
Iceblue
2018/10/17
1K0
C# 绘制PDF嵌套表格
C#中的枚举器(译)
翻译文章,原文链接(已失效):http://www.ondotnet.com/pub/a/dotnet/2004/06/07/liberty.html
张子阳
2018/09/27
1.9K0
C#嵌套任务和子任务
  任务嵌套就是指在一个任务中又创建了一个任务,而这个新建的任务,就被称为子任务。在没有特殊声明的情况下,父子任务是一起运行的,如SimpleNestedTask方法。   如果想让父子任务关联起来的话,需要在创建子任务的时候,增加参数TaskCreationOptions.AttachedToParent,将父子任务关联起来,这样父任务将等待子任务完成,才会完成。   如果使用Task<TResult>创建任务的话,这不需要使用TaskCreationOptions.AttachedToParent参数了,因为只要父任务使用了子任务的返回结果,父任务自然就会等待子任务完成。
Kiba518
2019/05/25
1.1K0
C#-IEnumerator与IEnumerable
IEnumerable是所有可迭代非范型类的基础接口。IEnumerable包括一个方法GetEnumerator方法,方法返回一个IEnumerator。
祝你万事顺利
2019/08/23
9160
IEnumerable和IEnumerator的关系
using System; using System.Collections; public class Person { public Person(string fName, string lName) { this.firstName = fName; this.lastName = lName; } public string firstName; public string lastName; } public clas
小端
2018/04/16
9350
C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能
1、IEnumerator和IEnumerable的作用 其实IEnumerator和IEnumerable的作用很简单,就是让除数组和集合之外的类型也能支持foreach循环,至于foreach循环,如果不清楚,请参考C# foreach循环较for循环的优势与劣势 代码如下: static void Main(string[] args) { CatList cats = new CatList(); foreach (var cat in cats) {
郑小超.
2018/01/26
9800
迭代器模式
在面向对象编程里,迭代器模式是一种最简单也最常见的设计模式。它可以让用户透过特定的接口访问集合中的每一个元素而不用了解底层的实现。一般实现一个集合的方法有:数组,链表,哈希表等等,每种集合因为底层实现不同,遍历集合的方法也不同。对于数组或者列表,用户需要在对集合了解很清楚的前提下,可以自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦,而且暴露了集合类的内部表示给用户,数据也会不安全。而引入了迭代器方法后,用户用起来就简单的多了,并且更加安全。迭代器模式在客户访问类与集合类之间插入一个迭代器,这分离了聚合对象与其遍历行为,对客户也隐藏了其内部细节,且满足“单一职责原则”和“开闭原则”。所以,如果我们对各种集合的都实现了迭代器接口,就可以使存储数据和遍历数据的职责分离,并且让外部代码可以透明并统一地访问集合内部的数据,简化了遍历方式,还提供了良好的封装性,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用关心。
小蜜蜂
2019/07/14
6750
C#用链式方法表达循环嵌套1
情节故事得有情节,不喜欢情节的朋友可看第1版代码,然后直接跳至“三.想要链式写法” 一.起缘 故事缘于一位朋友的一道题: 朋友四人玩LOL游戏。第一局,分别选择位置:中单,上单,ADC,辅助;第二局新加入的伙伴要选上单,四人可选位置变为:中单,打野,ADC,辅助;要求,第二局四人每人不得选择和第一局相同的位置,请问两局综合考虑有多少种位置选择方式? 对于像我这边不懂游戏的人来讲,看不懂。于是有了这个版本: 有4个人,4只椅子,第一局每人坐一只椅子,第二局去掉第2只椅子,增加第5只椅子,每人坐一只椅子,而且每
逸鹏
2018/04/10
1K0
C#用链式方法表达循环嵌套1
C#基础知识系列九(对IEnumerable和IEnumerator接口的糊涂认识)
   IEnumerable、IEnumerator到现在为止对这两个接口还是不太理解,不理解但是自己总是想着试着要搞明白,毕竟自己用的少,所以在此先记录一下。以备自己日后可以来翻查,同时也希望园子里的大牛们,来帮我看看理解的怎么样。
aehyok
2018/08/31
6080
C#基础知识系列九(对IEnumerable和IEnumerator接口的糊涂认识)
C#用链式方法表达循环嵌套2
延迟计算是从Linq借鉴和学习来的,构造Linq的过程并没有执行,等到了执行ToList, First等方法时才真正去执行。 我想构造回调链每一步都是一个固定的方法,这里随便起用了T这个极短名称,而每一步后期计算时要执行的方法可灵活指定。于是有了第3版: static Seat data = new Seat(); //借用Seat保存数据 public Seat2(string name, Seat2 parent, Action<Seat2> method) { this.Name =
逸鹏
2018/04/10
6670
迭代器模式
主要思想和实现方式: 迭代器模式的主要思想是将数据的存储和遍历分离,使得客户端可以通过统一的接口遍历不同类型的集合,而不需要关心集合的具体实现。在C#中,迭代器模式可以通过实现IEnumerable接口和IEnumerator接口来实现。IEnumerable接口定义了一个方法GetEnumerator(),该方法返回一个实现了IEnumerator接口的迭代器对象。IEnumerator接口包含了MoveNext()方法,用于移动迭代器到集合的下一个元素,以及Current属性,用于获取当前元素的值。
JusterZhu
2023/10/24
1640
迭代器模式
asp.net(C#)中Repeater嵌套绑定Repeater[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159124.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/14
1K0
通过运行期类型检查实现泛型算法
虽然我们可以通过指定不同的类型参数来实现泛型类的复用,但是在某些情况下通用就意味着我们无法利用具体类型的优势。针对这一点 C# 允许在发现类型参数所表示的对象具有更多的功能时编写更具体的代码。这一点是利用了泛型依据对象的编译器类型来进行实例化的这一特点,如果我们在开发时没有想到这一点就有很大的可能降低程序的性能。为了能讲清楚这一点,我们先来看一段代码,这段代码要做的是倒序输出序列中的内容。
喵叔
2020/09/08
6440
枚举器与迭代器
这次我们再次来讲解一下开发人员会用但不理解的C#中的知识,这篇文章我们讲解一下枚举器与迭代器的知识。
喵叔
2020/09/08
4760
枚举器与迭代器
C#2.0新增功能05 迭代器
  迭代器方法或 get 访问器可对集合执行自定义迭代。 迭代器方法使用 yield return 语句返回元素,每次返回一个。 到达 yield return 语句时,会记住当前在代码中的位置。 下次调用迭代器函数时,将从该位置重新开始执行。
张传宁IT讲堂
2019/09/17
7470
Coroutine,你究竟干了什么?(小续)
前篇中讲了一些自己关于Coroutine的理解,后来陆陆续续的又想到了一些,在此简单记录一下,内容不多,故作“小”续吧 :)
用户2615200
2018/08/02
7360
Coroutine,你究竟干了什么?(小续)
重温设计模式 --- 迭代器模式
迭代器模式是一种行为型设计模式,它允许按照特定顺序遍历集合对象的元素,同时不暴露集合的内部结构。这样做可以让客户端代码不依赖于集合对象的具体实现,从而提高代码的灵活性和可重用性。
Niuery Diary
2023/10/22
1570
重温设计模式 --- 迭代器模式
Coroutine,你究竟干了什么?
  使用Unity已经有一段时间了,对于Component、GameObject之类的概念也算是有所了解,而脚本方面从一开始就选定了C#,目前来看还是挺明智的:Boo太小众,而且支持有限;JS(或着说UnityScript)的话稍稍自由散漫了些,不太符合我们这些略显严谨的程序猿;相比之下,C#各方面都十分沁人心腑,使用起来还是相当舒畅的 :)
用户2615200
2018/08/02
1.1K0
Coroutine,你究竟干了什么?
C Sharp(十三)
这一篇,我们看看 C# 中的枚举器和迭代器的基本概念。 之前我们说过可以使用 foreach 来遍历数组元素,本篇来讨论为什么数组可以使用 foreach 语句处理,我们可以还使用迭代器来使得自定义类型也可以使用 foreach。
1ess
2021/11/01
6290

相似问题

不使用C#的统一IEnumerator函数

32

c#统一IEnumerator没有在夜间工作

12

使用IEnumerator遍历嵌套属性的C#

231

C#重用IEnumerator而不实现IEnumerator

10

IEnumerator WaitForSeconds没有在统一工作

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档