foreach中的函数调用了几次?
前段时间遇到了这样一个问题,下面的这段代码:
我们先来看一for循环的输出:
那么第一段代码会输出什么那?
因为foreach是在GetTheDatas()返回的Enumerators上的迭代,而不像for循环那样简单地每次调用GetTheDatas()函数,对于每个foreach的每次循环,会隐式地调用GetTheDatas()返回的IEnumerators的GetEnumerator()方法,而不是对GetTheDatas()函数本身进行迭代,所以每次从外层循环进入本层循环都会调用一次GetTheDatas()获取Enumerators,然后在Enumerators上调用GetEnumerator()进行迭代.
这样第一段代码的输出应该为:1+1(第一层循环)+3(第二层循环)+3*3(第三层循环)=14.
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});
}
}
不用编译工具,猜测一下有注释的地方输出结果是多少?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()函数.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});
}
}
那么第一段代码会输出什么那?
因为foreach是在GetTheDatas()返回的Enumerators上的迭代,而不像for循环那样简单地每次调用GetTheDatas()函数,对于每个foreach的每次循环,会隐式地调用GetTheDatas()返回的IEnumerators的GetEnumerator()方法,而不是对GetTheDatas()函数本身进行迭代,所以每次从外层循环进入本层循环都会调用一次GetTheDatas()获取Enumerators,然后在Enumerators上调用GetEnumerator()进行迭代.
这样第一段代码的输出应该为:1+1(第一层循环)+3(第二层循环)+3*3(第三层循环)=14.