IEnumable和yield

yield是C#为了简化遍历操作实现的语法糖,我们知道如果要要某个类型支持遍历就必须要实现系统接口IEnumerable,还需要实现IEnumerator,

static void Main(string[] args)
{
foreach (var item in new Program().SayHappyNewYear())
{
Console.WriteLine(item);
}
MyList2 myList2 = new MyList2();
foreach (var item in myList2)
{
Console.WriteLine(item);
}

}

使用yield的写法

public IEnumerable<String> SayHappyNewYear()
{
yield return ""; // yield在这里充当隐式的IEnumerator接口
yield return "";
yield return "";
yield return "";
yield break; // 向迭代器发出结束迭代的信号
}

不使用yield,实现IEnumerable和IEnumerator的写法

class MyList2 : IEnumerable
{
public IEnumerator GetEnumerator()
{
IEnumerator tor = new MyEnumerator(0);
return tor;
}

public class MyEnumerator : IEnumerator
{
private int state;
private object current;
public MyEnumerator(int state)
{
this.state = state;
}

public object Current
{
get { return current; }
}

public bool MoveNext()
{
switch (state)
{
case 0:
current = "";
state = 1;
return true;
case 1:
current = "";
state = 2;
return true;
case 2:
current = "";
state = 3;
return true;
case 3:
current = "";
state = 4;
return true;
case 4:
return false;
default:
break;
}
return false;
}

public void Reset()
{
throw new NotImplementedException();
}
}
}

使用yield关键字后return 指定的对象后,当前位置会进行保存下来,下次调用的时候会从这个位置开始执行。 
说白了,C#编译器会在编译后生成一个密封的类,该类实现了IEnumerator接口,所以是语法糖。

猜你喜欢

转载自www.cnblogs.com/adspark/p/11804356.html