zoukankan      html  css  js  c++  java
  • for和foreach的区别

    public class Program
    {
    
        public static void Main()
        {
            Program program = new Program();
            program.For();//For方法是实例方法,必须先实例化再使用。
            ForeachOnArray();//静态方法,可以直接调用。
        }
    
        public void For()
        {
            string[] array = new string[] { "111", "222", "333" };
    
            for (int i = 0; i < array.Length; i++)
            {
                Console.WriteLine(array[i]);//111 222 333
                Console.ReadKey();
            }
        }
    
        public static void ForeachOnArray()
        {
            string[] array = new string[] { "111", "222", "333" };
    
            foreach (string s in array)
            {
                Console.WriteLine(s);//111 222 333
            }
        }
    }

    再加点代码,在循环中试图更改所操作的值:

    public class Program
    {
    
        public static void Main()
        {
            Program program = new Program();
            program.For();//For方法是实例方法,必须先实例化再使用。
            ForeachOnArray();//静态方法,可以直接调用。
        }
    
        public void For()
        {
            string[] array = new string[] { "111", "222", "333" };
    
            for (int i = 0; i < array.Length; i++)
            {
                Console.WriteLine(array[i]);//111 222 333
                array[i] = "changed";//可以更改
                Console.ReadKey();
            }
        }
    
        public static void ForeachOnArray()
        {
            string[] array = new string[] { "111", "222", "333" };
    
            foreach (string s in array)
            {
                Console.WriteLine(s);//111 222 333
                s = "changed";//Error: Cannot assign to 's' because it is a 'foreach iteration variable'
            }
        }
    }

    以上代码,可以看出,在Foreach(...)循环里尽量不要更改操作的源,在For(...)循环里则可以。

    For和Foreach的区别:

    1. for循环并不依赖于数组或其他形式的组式数据结构,只是简单的在调用了代码后,进行一个判断,判断是否要继续。(非常类似于do..while和while循环)
    2. foreach循环如果作用在一个基于System.Array的类型之上的数组,编译器会自动优化成与for循环非常类似的代码,只是调用的指命有细微的差别,并且检查(包括编译阶段和运行时)会比for严格的多。
    3. foreach循环作用在一个非System.Array类型上(且一定要是实现了IEnumerable接口的类),会先调用IEnumerable.GetEnumerator()方法获取一个Enumertor实例,再在获取的Enumertor实例上调用GetCurrent()和MoveNext()方法,最后判断如果Enumertor实例如果实现了IDispose接口,就自动调用IDispose.Dispose()方法!

    For和Foreach建议用法:

    1. 在System.Array做赋值操作时,尽量不要用Foreach()。
    2. foreach比for更灵活。(可在MoveNext()和GetCurrent()里编写自己的代码)自己编写的类如果实现了IEnumerable接口的话,就可以用foreach循环了,而不管内部是否有一个真实的数组,并且可以自定义循环的规则。
    3. 从OO的原则看,foreach循环更适于多数情况的使用。(事实上,foreach的实现是典型的Iterator模式,想用统一的调用循环接口时,foreach是最佳的选择)
  • 相关阅读:
    第一章--linux基础
    深入浅出OOP(一): 多态和继承(早期绑定/编译时多态)
    LeetCode Letter Combinations of a Phone Number
    ios 仿android gallery控件
    android何如获取SIM卡提供国家代码(ISO)
    android 获取 imei号码
    overridePendingTransition的简介
    转 Android Activity之间动画完整版详解
    【android开发】使用PopupWindow实现页面点击顶部弹出下拉菜单
    Android 带你从源码的角度解析Scroller的滚动实现原理
  • 原文地址:https://www.cnblogs.com/chrisghb8812/p/5620788.html
Copyright © 2011-2022 走看看