日期:2014-05-18  浏览次数:20816 次

一个关于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买本好书仔细研究吧。