public class Program
{ public static void Main()
{
Program program = new Program();
program.For();//For方法是实例方法,必须先实例化再使用。
ForeachOnArray();//静态方法,可以直接调用。
} public void For()
{
string[] array = new string[] { "", "", "" }; for (int i = ; i < array.Length; i++)
{
Console.WriteLine(array[i]);//111 222 333
Console.ReadKey();
}
} public static void ForeachOnArray()
{
string[] array = new string[] { "", "", "" }; 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[] { "", "", "" }; for (int i = ; i < array.Length; i++)
{
Console.WriteLine(array[i]);//111 222 333
array[i] = "changed";//可以更改
Console.ReadKey();
}
} public static void ForeachOnArray()
{
string[] array = new string[] { "", "", "" }; 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是最佳的选择)

for和foreach的区别的更多相关文章

  1. for循环与foreach的区别

    for循环与foreach的区别 foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后 ...

  2. every();some();filter();map();forEach()各自区别:

    every();some();filter();map();forEach()各自区别: (1)every()方法:(返回值为boolean类型) 对数组每一项都执行测试函数,知道获得对指定的函数返回 ...

  3. JS中map与forEach的区别

    很多同学可能对于map与forEach的区别不是太了解,今天我们介绍一下JS中的map与forEach方法, 我对map的理解是,这个方法对一个数组arr1中的每一个元素进行遍历(传递给一个数组,参数 ...

  4. IL角度理解for 与foreach的区别——迭代器模式

    IL角度理解for 与foreach的区别--迭代器模式 目录 IL角度理解for 与foreach的区别--迭代器模式 1 最常用的设计模式 1.1 背景 1.2 摘要 2 遍历元素 3 删除元素 ...

  5. Javascript/Jquery 中each() 和forEach()的区别

    从名字看上去这两个方法好像有点关系,但在javascript中它们区别还是挺大的. forEach() 用于数组的操作,对数组中的每个元素执行制定的函数(不是数组不能使用forEach()方法). 而 ...

  6. js keys方法和foreach方法区别

    keys和foreach都有遍历对象的功能,但他们可以遍历的对象类型是不一样的,foreach是数组对象的方法,而keys是Object对象的方法.换句话说,foreach只能数组对象使用,而keys ...

  7. JavaScript中Map和ForEach的区别

    译者按: 惯用Haskell的我更爱map. 原文: JavaScript — Map vs. ForEach - What’s the difference between Map and ForE ...

  8. JS中map和foreach的区别以及some和every的用法

    一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...

  9. js forEach for区别

    1.循环中断差别 具体见示例代码: <!DOCTYPE html> <html lang="zh"> <head> <meta chars ...

随机推荐

  1. Android设计和开发系列第一篇:Notifications通知(Design)

    Design篇 Notifications The notification system allows users to keep informed about relevant and timel ...

  2. slice 定义和用法

    定义和用法 slice() 方法可从已有的数组中返回选定的元素. 语法 arrayObject.slice(start,end) 参数 描述 start 必需.规定从何处开始选取.如果是负数,那么它规 ...

  3. win10下网狐荣耀手机端android app编译

    基于荣耀版(2017.5.21)12 款游戏..7z这款游戏,网上有下载的 1.解压后进入 cd shoujiduan 2.将client/base复制到client/ciphercode/下,也就是 ...

  4. ubuntu安装vncserver实现图形化访问

    请注意: 如果在安装中部分软件无法安装成功,说明软件源中缺包,先尝试使用命令#apt-get update更新软件源后尝试安装.如果还是不行,需要更换软件源.更换步骤: a)输入命令#cp /etc/ ...

  5. isolinux.cfg 文件是干什么的

    1.   首先光盘镜像也就是iso文件采用的是“ISO 9660 ”文件系统 . cd上的文件都存在这个简单的iso文件系统里,linux可以用mount  -o loop 直接把*.iso文件mou ...

  6. [Tjoi2016&Heoi2016]排序[01序列]

    4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 994  Solved: 546[Sub ...

  7. Linux(CentOS)安装JDK(.tar.gz)并配置

    本文思路转自http://blog.sina.com.cn/s/blog_81631744010137iy.html 点击(此处)折叠或打开 1.到 甲骨文(oracle)下载jdk不用多说 tar ...

  8. iOS - 网址、链接、网页地址、下载链接等正则表达式匹配(解决url包含中文不能编码的问题)

    DNS规定,域名中的标号都由英文字母和数字组成,每一个标号不超过63个字符,也不区分大小写字母.标号中除连字符(-)外不能使用其他的标点符号.级别最低的域名写在最左边,而级别最高的域名写在最右边.由多 ...

  9. springMVC去掉静态资源的拦截

    前端控制器的配置 <!-- springmvc的前端控制器 --> <servlet> <servlet-name>springMVC</servlet-na ...

  10. js 的基础知识

    一.弱类型意识 js变量是没有类型的 var  a = 1;  //a 就是一个变量 不要提什么类型 变量可以赋任何类型的值 类型仅仅是值的性质 与变量无关 Js的基本类型 变量未赋值时,其值为und ...