for和foreach的区别
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的区别:
- for循环并不依赖于数组或其他形式的组式数据结构,只是简单的在调用了代码后,进行一个判断,判断是否要继续。(非常类似于do..while和while循环)
- foreach循环如果作用在一个基于System.Array的类型之上的数组,编译器会自动优化成与for循环非常类似的代码,只是调用的指命有细微的差别,并且检查(包括编译阶段和运行时)会比for严格的多。
- foreach循环作用在一个非System.Array类型上(且一定要是实现了IEnumerable接口的类),会先调用IEnumerable.GetEnumerator()方法获取一个Enumertor实例,再在获取的Enumertor实例上调用GetCurrent()和MoveNext()方法,最后判断如果Enumertor实例如果实现了IDispose接口,就自动调用IDispose.Dispose()方法!
For和Foreach建议用法:
- 在System.Array做赋值操作时,尽量不要用Foreach()。
- foreach比for更灵活。(可在MoveNext()和GetCurrent()里编写自己的代码)自己编写的类如果实现了IEnumerable接口的话,就可以用foreach循环了,而不管内部是否有一个真实的数组,并且可以自定义循环的规则。
- 从OO的原则看,foreach循环更适于多数情况的使用。(事实上,foreach的实现是典型的Iterator模式,想用统一的调用循环接口时,foreach是最佳的选择)
for和foreach的区别的更多相关文章
- for循环与foreach的区别
for循环与foreach的区别 foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后 ...
- every();some();filter();map();forEach()各自区别:
every();some();filter();map();forEach()各自区别: (1)every()方法:(返回值为boolean类型) 对数组每一项都执行测试函数,知道获得对指定的函数返回 ...
- JS中map与forEach的区别
很多同学可能对于map与forEach的区别不是太了解,今天我们介绍一下JS中的map与forEach方法, 我对map的理解是,这个方法对一个数组arr1中的每一个元素进行遍历(传递给一个数组,参数 ...
- IL角度理解for 与foreach的区别——迭代器模式
IL角度理解for 与foreach的区别--迭代器模式 目录 IL角度理解for 与foreach的区别--迭代器模式 1 最常用的设计模式 1.1 背景 1.2 摘要 2 遍历元素 3 删除元素 ...
- Javascript/Jquery 中each() 和forEach()的区别
从名字看上去这两个方法好像有点关系,但在javascript中它们区别还是挺大的. forEach() 用于数组的操作,对数组中的每个元素执行制定的函数(不是数组不能使用forEach()方法). 而 ...
- js keys方法和foreach方法区别
keys和foreach都有遍历对象的功能,但他们可以遍历的对象类型是不一样的,foreach是数组对象的方法,而keys是Object对象的方法.换句话说,foreach只能数组对象使用,而keys ...
- JavaScript中Map和ForEach的区别
译者按: 惯用Haskell的我更爱map. 原文: JavaScript — Map vs. ForEach - What’s the difference between Map and ForE ...
- JS中map和foreach的区别以及some和every的用法
一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...
- js forEach for区别
1.循环中断差别 具体见示例代码: <!DOCTYPE html> <html lang="zh"> <head> <meta chars ...
随机推荐
- Android设计和开发系列第一篇:Notifications通知(Design)
Design篇 Notifications The notification system allows users to keep informed about relevant and timel ...
- slice 定义和用法
定义和用法 slice() 方法可从已有的数组中返回选定的元素. 语法 arrayObject.slice(start,end) 参数 描述 start 必需.规定从何处开始选取.如果是负数,那么它规 ...
- win10下网狐荣耀手机端android app编译
基于荣耀版(2017.5.21)12 款游戏..7z这款游戏,网上有下载的 1.解压后进入 cd shoujiduan 2.将client/base复制到client/ciphercode/下,也就是 ...
- ubuntu安装vncserver实现图形化访问
请注意: 如果在安装中部分软件无法安装成功,说明软件源中缺包,先尝试使用命令#apt-get update更新软件源后尝试安装.如果还是不行,需要更换软件源.更换步骤: a)输入命令#cp /etc/ ...
- isolinux.cfg 文件是干什么的
1. 首先光盘镜像也就是iso文件采用的是“ISO 9660 ”文件系统 . cd上的文件都存在这个简单的iso文件系统里,linux可以用mount -o loop 直接把*.iso文件mou ...
- [Tjoi2016&Heoi2016]排序[01序列]
4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 994 Solved: 546[Sub ...
- Linux(CentOS)安装JDK(.tar.gz)并配置
本文思路转自http://blog.sina.com.cn/s/blog_81631744010137iy.html 点击(此处)折叠或打开 1.到 甲骨文(oracle)下载jdk不用多说 tar ...
- iOS - 网址、链接、网页地址、下载链接等正则表达式匹配(解决url包含中文不能编码的问题)
DNS规定,域名中的标号都由英文字母和数字组成,每一个标号不超过63个字符,也不区分大小写字母.标号中除连字符(-)外不能使用其他的标点符号.级别最低的域名写在最左边,而级别最高的域名写在最右边.由多 ...
- springMVC去掉静态资源的拦截
前端控制器的配置 <!-- springmvc的前端控制器 --> <servlet> <servlet-name>springMVC</servlet-na ...
- js 的基础知识
一.弱类型意识 js变量是没有类型的 var a = 1; //a 就是一个变量 不要提什么类型 变量可以赋任何类型的值 类型仅仅是值的性质 与变量无关 Js的基本类型 变量未赋值时,其值为und ...