您的位置:首页 > 编程语言 > C#

关于C#之yield return 话题

2009-11-24 19:35 369 查看
还是先来个具体的实例吧:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace yeildTST
{
public class List
{
public static IEnumerable Power(int number)
{
while (number< 100)
{
number = number + number;
yield return number;
}
}

static void Main()
{
foreach (int i in Power(1))
{
Console.Write("{0} ", i);
}

Console.ReadLine();
}
}
我们来通过这个例子看看yield return的庐山真面目,我查了下原始编译代码:
using System;

using System.Collections.Generic;

using System.Text;

using System.Threading;

namespace yeildTST
{
public class List

{
static void Main()

{

foreach (int i in Power(1))

{

Console.Write("{0} ", i);

}

Console.ReadLine();

}

public static IEnumerable Power(int number)

{

d__0 d__ = new d__0(-2);

d__._3__number = number;

return d__;

}

//// Nested Types

//[CompilerGenerated]

public class d__0 : IEnumerable<object>, IEnumerable, IEnumerator<object>, IEnumerator, IDisposable

{

// Fields

private int _1__state;

private object _2__current;

public int _3__number;

private int _l__initialThreadId;

public int number;

// Methods

//[DebuggerHidden]

public d__0(int _1__state)

{

this._1__state = _1__state;

this._l__initialThreadId = Thread.CurrentThread.ManagedThreadId;

}

public bool MoveNext()

{

switch (this._1__state)

{

case 1:
// goto label_057;-----生成的源代码

//////////我修改后的代码,原来没有//////
_1__state = -1;
while (this.number < 100)
{
this.number += this.number;
this._2__current = this.number;
this._1__state = 1;
return true;
}
break;
///////////////////////////////

case 0:
this._1__state = -1;
while (this.number < 100)
{
this.number += this.number;
this._2__current = this.number;
this._1__state = 1;

//label_****: -----生成的源代码
//this._1__state=-1;

return true;
}

break;

}

return false;

}

//[DebuggerHidden]

IEnumerator<object> IEnumerable<object>.GetEnumerator()

{

return null;////////不用到这个,所以代码去掉了。

}

//[DebuggerHidden]

IEnumerator IEnumerable.GetEnumerator()

{

List.d__0 d__;

if ((Thread.CurrentThread.ManagedThreadId == this._l__initialThreadId) && (this._1__state == -2))

{

this._1__state = 0;

d__ = this;

}

else

{

d__ = new List.d__0(0);

}

d__.number = this._3__number;

return d__;

}

//[DebuggerHidden]

void IEnumerator.Reset()

{

throw new NotSupportedException();

}

void IDisposable.Dispose()

{

}

// Properties

object IEnumerator<object>.Current

{

// [DebuggerHidden]

get

{

return this._2__current;

}

}

object IEnumerator.Current

{

//[DebuggerHidden]

get

{

return this._2__current;

}

}

}

}

}

仔细看这段代码,多了一个类,d_0,它实现了各种枚举接口,由于我们的例题没有用到泛型,所以新生成的代码中

泛型部分可省去,经过我的测试,它对类中执行方法的顺序是这样的:

开始

GetEnumerator() => MoveNext() => IEnumerator.Current

第二次,从MoveNext() => IEnumerator.Current 。。。。。。。直到循环完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: