一个关于yield返回的问题
有这么一个求质数的程序
类Primes:如下using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace Ch11Ex03
{
public class Primes
{
private long min;
private long max;
public Primes()
: this(2, 100)
{
}
public Primes(long minimum, long maximum)
{
if (min < 2)
{
min = 2;
}
min = minimum;
max = maximum;
}
public IEnumerator GetEnumerator()
{
for(long possiblePrime=min;possiblePrime<=max;possiblePrime++)
{
bool isPrime=true;
for(long possibleFactor=2;possibleFactor<=(long)Math.Floor(Math.Sqrt(possiblePrime));possibleFactor++)
{
long remainderAfterDivision=possiblePrime%possibleFactor;
if(remainderAfterDivision==0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
yield return possiblePrime; }
}
}
}
}
programs如下:using System;
using System.Collections.Generic;
using System.Text;
namespace Ch11Ex03
{
class Program
{
static void Main(string[] args)
{
Primes primesFrom2To1000 = new Primes(2, 100000);
foreach (long i in primesFrom2To1000)
Console.Write("{0} ", i);
Console.ReadKey();
}
}
}
我想知道yield返回值是传递给谁,primesFrom2To1000?
如果是,当前循环返回了值以后,循环是怎么继续运行的。
这个地方很含糊,不清楚。
谢谢
------解决方案-------------------- yield return possiblePrime;
并不是类似return的返回命令。
这里的函数真正返回的是一个实现了IEnumerator接口的对象。那么这个对象到底是哪个类型的一个实例呢?这个类型的代码是如何的呢?这些都由C#编译器为你自动生成。你所知道的就是这个对象在作为IEnumerator被使用时会发生什么呢?在MoveNext和Current配合的时候,随着Current返回的值就是possiblePrime这个地方用yield return所返回的值了。
由于C#加入这个关键字引入了太多的误解,建议LZ买本好书仔细研究吧。