Farseer

导航

foreach中的函数调用了几次?

前段时间遇到了这样一个问题,下面的这段代码:
using System;

class test
{
    
private static int inNumber = 0;
    
public static void Main()
    
{
        
int[] tt = GetTheDatas();
        
foreach(int i in  GetTheDatas())
            
foreach(int j in  GetTheDatas())
                
foreach(int k in GetTheDatas())
                    Console.WriteLine(i
*j*k);
        Console.ReadLine();
        Console.WriteLine(inNumber);    
//这里输出多少?
        Console.ReadLine();
        
    }

    
private static int[] GetTheDatas()
    
{
        inNumber
++;
        
return (new int[]{1,2,3});    
    }

}
不用编译工具,猜测一下有注释的地方输出结果是多少?
我们先来看一for循环的输出:
using System;

class test
{
    
private static int inNumber = 0;
    
public static void Main()
    
{
        
int[] tt = GetTheDatas();
        
for(int i = 0;i<tt.Length;i++)    
            
for(int j = 0;j<tt.Length;j++)
                
for(int k = 0;k<tt.Length;k++)
                    Console.WriteLine(GetTheDatas()[i]
*GetTheDatas()[j]*GetTheDatas()[k]);
        Console.ReadLine();
        Console.WriteLine(inNumber);    
//这里输出多少?
        Console.ReadLine();
        
    }

    
private static int[] GetTheDatas()
    
{
        inNumber
++;
        
return (new int[]{1,2,3});    
    }

}
很容易得出输出应该为1+3*3*3*3=82,因为每次循环都会调用3次GetTheData()函数.
那么第一段代码会输出什么那?
因为foreach是在GetTheDatas()返回的Enumerators上的迭代,而不像for循环那样简单地每次调用GetTheDatas()函数,对于每个foreach的每次循环,会隐式地调用GetTheDatas()返回的IEnumerators的GetEnumerator()方法,而不是对GetTheDatas()函数本身进行迭代,所以每次从外层循环进入本层循环都会调用一次GetTheDatas()获取Enumerators,然后在Enumerators上调用GetEnumerator()进行迭代.
这样第一段代码的输出应该为:1+1(第一层循环)+3(第二层循环)+3*3(第三层循环)=14.

posted on 2005-11-27 14:39  佛西亚  阅读(668)  评论(0编辑  收藏  举报