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 ...
随机推荐
- django进阶-1
前言: 各位久等了,django进阶篇来了. 一.get与post 接口规范: url不能写动词,只能写名词 django默认只支持两种方式: get, post get是获取数据 ?user=zcl ...
- KMP算法的实现(Java语言描述)
标签:it KMP算法是模式匹配专用算法. 它是在已知模式串的next或nextval数组的基础上执行的.如果不知道它们二者之一,就没法使用KMP算法,因此我们需要计算它们. KMP算法由两部分组成: ...
- jQuery属性操作(四)
通过阅读jQuery为属性操作封装的基本方法和为处理兼容性问题提供的hooks,发现jQuery在属性操作方面并没有做过多的设计,只是处理一下兼容性问题,然后调用基础的DOM操作方法.以下是对JQue ...
- [Error: Failed to find 'ANDROID_HOME' environment variable. Try setting setting it manually
7down voteaccepted I don't think its necessary to add everything into path.Just add the JAVA_HOME , ...
- mysql优化之伪哈希索引
想法非常简单,在标准的B-Tree索引上创建一个伪哈希索引.它和真正的哈希索引不是一回事,因为它还是使用B-Tree索引进行查找.然而,它将会使用键的哈希值进行查找,而不是键自身.你所要做的事情就是在 ...
- SocketAsyncEventArgs的释放问题
起因是发现一个同事编写的程序运行两个月左右,占用了服务器20G左右的内存.用WinDbg查看发现存在大量的Async Pinned Handles,而它们的gcroot都来自于SocketAsyncE ...
- javap(反汇编命令)详解
javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码.通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作. 语法: javap [ 命令选项 ] class. . ...
- [APP] Android 开发笔记 006-使用短信验证SDK进行短信验证
1. 下载SDK (http://www.mob.com/#/download) SMS For Android Studio: http://www.mob.com/download/sms/and ...
- Unity3D笔记 NUGUI 一
NGUI是严格遵循KISS原则(KISS原则,keep it simple and stupid ,简单的理解这句话就是,要把一个系统做的连白痴都会用.这就是用户体验的高层境界了,好听的说法也是有的, ...
- iOS - Block的简单使用
Block 的使用有两种: .独立Block .内联Block <一>独立Block 使用方式 一.定义一个Block Object,并调用. 1.定义 // 定义一个Bl ...