gpt4 book ai didi

c# - IEnumerator 或 IEnumerable 中的“产量”?

转载 作者:行者123 更新时间:2023-12-04 12:42:39 26 4
gpt4 key购买 nike

我一直在寻找这一点,但我还没有得到任何关于它的信息!。

我看了很多关于“ yield 返回”的视频和红色文章,我想我对它有更好的理解,但有一点我无法理解

我应该使用 yield return 的正确接口(interface)是什么? (当然 Yield return 将在 Loop 中使用,但在哪个接口(interface)中)。

我的意思是在这一点上有变化,我看到有些人创建了 “迭代器”IEnumerator , 例如 :

static string[] Names = { "Name1", "Name2", "Name3" };

static IEnumerator Test()
{
for (int i = 0; i < Names.Length; i++)
{
yield return Names[i];
}
}

和其他一些人使用 IEnumerable :
        static IEnumerable Test()
{
for (int i = 0; i < Names.Length; i++)
{
yield return Names[i];
}
}

我假设最好在 IEnumerable 内使用“ yield 返回”创建“迭代器”接口(interface),因为通常 IEnumerable 负责访问类(更准确地说,它返回类(Object)的实例),捍卫迭代逻辑。在这种情况下,编译器(yield 关键字的糖)究竟发生了什么。
 private static IEnumerable Test() => new <Test>d__1(-2);
//decompiled code of Test() method above Using reflector tool

关于这个的任何想法?

最佳答案

编译器支持两者,实际上如果返回值是IEnumerable<T> ,生成的类将实现两个接口(interface),其中 GetEnumerator()是这样实现的(大致):

IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
if (state == Created && initialThreadId == Environment.CurrentManagedThreadId)
{
state = EnumerationStarted;
return this;
}
else
return new GeneratedEnumerableEnumerator(state: EnumerationStarted);
}
state在上面的代码中是一个 int , CreatedEnumerationStarted不是真正的常量名称。 state根据实现的复杂性,可以有许多内部值。

What is the Correct interface should i use yield return



这取决于你的情况。如果您实现 IEnumerable<T>.GetEnumerator()在您的自定义集合类型中使用 IEnumerator<T> .如果您需要返回 IEnumerable<T> ,其内容很容易产生,然后使用 IEnumerable<T> .两者都可以说得通。

关于c# - IEnumerator 或 IEnumerable 中的“产量”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52479148/

26 4 0