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. 【MySQL】 Cannot load from mysql.proc. The table is probably corrupted

    解决办法 在 mysql 这张表里边.执行sql ALTER TABLE `proc` MODIFY COLUMN `comment` text CHARACTER SET utf8 COLLATE ...

  2. 【Spring Boot && Spring Cloud系列】Spring Boot的启动器Starter

    Spring Boot的内置Servlet Container: Name Servlet Version Java Version Tomcat8 3.1 Java 7+ Tomcat7 3.0 J ...

  3. 异构GoldenGate 12c 单向复制配置(支持DDL复制)

    1.开始配置OGG支持DDL复制(在source端操作) 1.1 赋予权限 SQL> conn /as sysdba 已连接. SQL> grant execute on utl_file ...

  4. openstack-networking-neutron(三)---用户态和内核态的区别

    究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...

  5. [Html5] HTML5 开发手机应用

    上次周例会我给大家做了题目为:<漫游移动平台前端开发>的汇报,现在推荐一些额外的学习资料.          依照目前iPhone/Android 迅速提升市占率的情势来看,未来如果想要在 ...

  6. php---截取描述方法

    参考: https://www.cnblogs.com/xsphehe/p/5682004.html 示例: /** * 参数说明 * $string 欲截取的字符串 * $sublen 截取的长度 ...

  7. mysql多列索引优化

    “把Where条件里面的列都建上索引”,这种说法其实是非常错误的! 这样一个查询,假设actor_id与film_id都单独建立索引 SELECT film_id , actor_id FROM sa ...

  8. Zabbix监控Nginx状态信息

    首先要检查Nginx是否安装了 http_stub_status_module 模块,通过下面的命令可以看到编译参数.yum安装的默认会带有这个模块. [root@kafka60 ~]# /data/ ...

  9. Saltstack之api

    Salt-API 1,htps证书 2,配置文件 3,验证.使用PAM验证 4,启动salt-api 安装salt-api yum -y install salt-api 创建用户 useradd - ...

  10. IIS7.5 配置虚拟目录的经历

    好多网站为了不带上什么端口号所有就建立虚拟目录的试来使用80端口 iis6设置都没有问题可到了7.5碰到了点问题 原来7.5上有个:添加应用程序和添加虚拟目录.还有个转换为应用程序 直接把网站建成虚拟 ...