关于C#之yield return 话题

          还是先来个具体的实例吧:
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 。。。。。。。直到循环完成。

posted on 2009-11-24 19:35  Mayvar  阅读(3145)  评论(0编辑  收藏  举报

导航