C#中添加Linq支持,只需添加一个迭代器就完成支持。迭代器模式是面向对象语言一个常见设计模式,C#中无需像C++那样维护一个内部状态,通过关键字yield模式来实现,编译器通过自动生成一个内部类来维护迭代器中的状态。测试程序如下:
public class EYield : IEnumerable<string>
{
public IEnumerator<string> GetEnumerator()
{
for (int i = 0; i < 10; i++)
{
yield return string.Format("i:{0},date:{1}",i,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
};
class Program
{
static void Main(string[] args)
{
EYield y = new EYield();
Console.WriteLine("first:{0}",y.First());
foreach (var item in y)
{
Console.WriteLine("item:{0}",item);
}
Console.ReadLine();
}
}
继承IEnumerable<T>基类就可以调用Linq方法,这样编写的程序就多了很多功能,通过反汇编可看出其内部实现的视图:
| M A N I F E S T
|___[NSP] IEnumYield
| |___[CLS] IEnumYield.EYield
| | | .class public auto ansi beforefieldinit
| | | implements class [mscorlib]System.Collections.Generic.IEnumerable`1<string>
| | | implements [mscorlib]System.Collections.IEnumerable
| | |___[CLS] <GetEnumerator>d__0
| | | | .class nested private auto ansi sealed beforefieldinit
| | | | implements class [mscorlib]System.Collections.Generic.IEnumerator`1<string>
| | | | implements [mscorlib]System.Collections.IEnumerator
| | | | implements [mscorlib]System.IDisposable
| | | | .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) ...
| | | |___[FLD] <>1__state : private int32
| | | |___[FLD] <>2__current : private string
| | | |___[FLD] <>4__this : public class IEnumYield.EYield
| | | |___[FLD] <i>5__1 : public int32
| | | |___[MET] .ctor : void(int32)
| | | |___[MET] MoveNext : bool()
| | | | System.Collections.Generic.IEnumerator<System.String>.get_Current : string()
| | | |___[MET] System.Collections.IEnumerator.Reset : void()
| | | |___[MET] System.Collections.IEnumerator.get_Current : object()
| | | |___[MET] System.IDisposable.Dispose : void()
| | | |___[PTY] 'System.Collections.Generic.IEnumerator<System.String>.Current' : instance string()
| | | |___[PTY] System.Collections.IEnumerator.Current : instance object()
| | |
| | |___[MET] .ctor : void()
| | | GetEnumerator : class [mscorlib]System.Collections.Generic.IEnumerator`1<string>()
| | |___[MET] System.Collections.IEnumerable.GetEnumerator : class [mscorlib]System.Collections.IEnumerator()
| |
| |___[CLS] IEnumYield.Program
| | | .class private auto ansi beforefieldinit
| | |___[MET] .ctor : void()
| | |___[STM] Main : void(string[])
| |
|
编译器通过自动产生一个d__0的内部类,该类通过维护内部状态(__state,__current),通过调用MoveNext方法来实现逐步向下移动,通过get_current方法类获取一个元素。
While(MoveNext())
{
get_current();
}