使用收益回报率描述迭代器

如果有人检查了我对这个主题的想法并在错误的地方纠正了我的想法,我将非常感激。我希望这种“请检查我的想法”不会过多违反网站的规则,我的问题更多是试图从一个不太了解的人那里回答某个主题的工作原理话题。希望对于像我这样的初学者来说,这可能是有价值的/有见地的,并且可能希望对正在发生的事情有一个高层次但非常基本的描述。

这是我了解IEnumerableIEnumerator主题和收益率的方法。

IEnumerableIEnumerator的交互方式非常清晰自然,我们有两个对象,一个对象保存集合,一个对象包含光标。

目前,让我们忽略yield return和两个接口之间的联系,只考虑以下概念/问题-假设我们的代码在每行上都有一些整数的表达式/计算,并且我们想创建一个函数f,该函数依次执行并返回这些整数,即,第一次调用f()时,它将返回在第一行计算的整数,第二次调用时将返回第二个整数,等等。完成此操作的自然方法是创建某种帮助类/对象,其中将包含所提到的代码,但除此之外,它还将存储我们在代码中的位置。使用goto可以做到。为了实现这一点,我们指定了yield return关键字来执行此操作-编译器意识到,如果我们内部有某种类型的代码块包含yield return,它将为它创建一个帮助器/控制器类。请注意,该辅助类在代码块上的作用方式与IEnumeratorIEnumerable上的作用方式非常相似-它在某种意义上存储了我们所在的“位置”。

接下来,我们将使用此概念并对其进行定义,以使其与IEnumeratorIEnumerable接口的现有功能一致。我们将针对的基本功能是foreach的功能-与实现IEnumerable接口的对象一起使用时,它将通过IEnumerator返回在IEnumerable.GetEnumerator中实现的游标然后使用MoveNextcurrent的方法沿集合移动并返回分别指向的对象。

因此,我们可以使用该概念的第一种方法是仅定义GetEnumerator-我们只需将要顺序执行的代码块放在GetEnumerator的主体中。为此,编译器会认识到,如果GetEnumerator的主体包含yield return,它将创建一个帮助器对象(并将该对象返回给调用程序中的GetEnumerator结束),该帮助程序类还将实现方法MoveNextCurrent为“执行下一行,并保存到_current(帮助程序类的某些字段),然后“返回{实际上,_current将返回上面两段提到的帮助器对象,此外,编译器还将在此帮助器对象中创建所需的GetEnumeratorMoveNext方法,以便它们沿着代码块移动,分别返回值。

我们可以使用该概念的另一种方法是直接“定义”集合并进行遍历。因此,这次,我们不仅返回Current / helper类,还返回IEnumerator。但是出于我们的目的,我们真的只是对能够与IEnumerable一起使用该对象感兴趣。因此,执行此操作的一种方法是执行与上述几乎相同的操作-我们将辅助对象同时实现为foreachIEnumerable-因此我们可以将其返回为{{1} }中的某个IEnumerator语句中,我们实现了IEnumerable以仅返回foreach。因此效果与上面非常相似。

以上内容有意义吗?我尚不清楚的一件事是,例如GetEnumerator是否可以以某种方式直接与this一起使用-即我们是否可以执行foreach,其中IEnumerator是一个可以仅返回(foreach element in Enumerator()),而不返回Enumerator()。这没有道理,但是我不确定编译器是否无法解决这些问题-尤其是因为它能够确定在体内看到IEnumerator时会做如此大的不同的事情,然后就像我已经提到的那样,创建一个辅助对象等,因此我不确定除此以外还有多少其他语法糖。

tsm1010 回答:使用收益回报率描述迭代器

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3169023.html

大家都在问