关于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 。。。。。。。直到循环完成。
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 。。。。。。。直到循环完成。
相关文章推荐
- C# 关于"yield return"的研究(转载)
- C# yield return用法分析
- C# yield return 和 yield break
- c# Yield return之简单方法实现迭代器和集合初始化器
- 关于C# IEnumerator、yield、Unity3D协程的一些东西
- 关于unity中使用yield return newWaitForSeconds()后面语句不执行
- C#yield return和yield break
- C# yield return; yield break;
- 关于ExecuteNonQuery执行存储过程的返回值 、、实例讲解存储过程的返回值与传出参数、、、C#获取存储过程的 Return返回值和Output输出参数值
- [提个醒] C#中yield return的小缺点
- C#关于For循环break,goto,return的应用
- 关于C#中{get;set;}与{get:return;set:value}的区别
- yield return in C#
- C# yield return 用法与解析
- C#yield return和yield break函数执行逻辑理解
- C# yield return 的作用
- C# yield return 流程理解
- C# yield return 用法与解析
- 彻底搞懂C#之Yield Return语法的作用和好处
- C# yield return 关键字的详解