• 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.
  • 相关阅读:
    MYSQL 优化指南
    设计模式——依赖倒置原则实例(PHP实现)
    PHP开发笔记
    反射应用
    HMAC-SHA1算法签名及Authorization头认证
    PHP接口和抽象类的区别
    PHP 模板方法模式使用
    RSA JS 加密解密DEMO
    RSA加密解密(PHP Demo)
    【Spark调优】提交job资源参数调优
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/285521.html
Copyright © 2020-2023  润新知