C#中foreach循环对比for循环的优势和劣势
作者:郑小超 发布时间:2021-12-29 23:50:59
标签:c#,for循环,foreach循环
前言
循环语句为众多程序员们提供了很大的便利,有while、do...while、for和 foreach。而且foreach语句很简洁,但是它的优点不仅仅在于此,它的效率也是最高的。本文将详细给大家关于C#中foreach循环对比for循环的优势和劣势,下面话不多说了,来一起看看详细的介绍吧。
一、foreach循环的优势
C#支持foreach关键字,foreach在处理集合和数组相对于for存在以下几个优势:
1、foreach语句简洁
2、效率比for要高(C#是强类型检查,for循环对于数组访问的时候,要对索引的有效值进行检查)
3、不用关心数组的起始索引是几(因为有很多开发者是从其他语言转到C#的,有些语言的起始索引可能是1或者是0)
4、处理多维数组(不包括锯齿数组)更加的方便,代码如下:
int[,] nVisited ={
{1,2,3},
{4,5,6},
{7,8,9}
};
// Use "for" to loop two-dimension array(使用for循环二维数组)
Console.WriteLine("User 'for' to loop two-dimension array");
for (int i = 0; i < nVisited.GetLength(0); i++)
for (int j = 0; j < nVisited.GetLength(1); j++)
Console.Write(nVisited[i, j]);
Console.WriteLine();
//Use "foreach" to loop two-dimension array(使用foreach循环二维数组)
Console.WriteLine("User 'foreach' to loop two-dimension array");
foreach (var item in nVisited)
Console.Write(item.ToString());
foreach只用一行代码就将所有元素循环了出来,而for循环则就需要很多行代码才可以.
注:foreach处理锯齿数组需进行两次foreach循环
int[][] nVisited = new int[3][];
nVisited[0] = new int[3] { 1, 2, 3 };
nVisited[1] = new int[3] { 4, 5, 6 };
nVisited[2] = new int[6] { 1, 2, 3, 4, 5, 6 };
//Use "foreach" to loop two-dimension array(使用foreach循环二维数组)
Console.WriteLine("User 'foreach' to loop two-dimension array");
foreach (var item in nVisited)
foreach (var val in item)
Console.WriteLine(val.ToString());
5、在类型转换方面foreach不用显示地进行类型转换
int[] val = { 1, 2, 3 };
ArrayList list = new ArrayList();
list.AddRange(val);
foreach (int item in list)//在循环语句中指定当前正在循环的元素的类型,不需要进行拆箱转换
{
Console.WriteLine((2*item));
}
Console.WriteLine();
for (int i = 0; i < list.Count; i++)
{
int item = (int)list[i];//for循环需要进行拆箱
Console.WriteLine(2 * item);
}
6、当集合元素如List<T>等在使用foreach进行循环时,每循环完一个元素,就会释放对应的资源,代码如下:
using (IEnumerator<T> enumerator = collection.GetEnumerator())
{
while (enumerator.MoveNext())
{
this.Add(enumerator.Current);
}
}
二、foreach循环的劣势
1、上面说了foreach循环的时候会释放使用完的资源,所以会造成额外的gc开销,所以使用的时候,请酌情考虑
2、foreach也称为只读循环,所以再循环数组/集合的时候,无法对数组/集合进行修改。
3、数组中的每一项必须与其他的项类型相等.
来源:http://www.cnblogs.com/GreenLeaves/p/7401605.html


猜你喜欢
- JAVA虽然是在C++基础上发展而来,但却对C++的许多缺陷有所改进,其中一个不得不提的就是字符串,我们知道,随着学习的深入,进入MFC时,
- mybatis count()按条件查询1、sql count()函数count()函数返回匹配指定条件的行数。sql count(colu
- 引言:上一专题介绍了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前的介绍都是委托只是封装一
- 为什么要在J2EE项目中谈异常处理呢?可能许多java初学者都想说:“异常处理不就是try….catch…finally吗?这谁都会啊!”。
- 一、什么是iText?在企业的信息系统中,报表处理一直占比较重要的作用,iText是一种生成PDF报表的Java组件。通过在服务器端使用Js
- 本文基于Java实现了一个简单的单词本安卓a
- 前言最近和前端联调接口,需要进行一个省市区联动,最终定的方案是通过接口返回一个树形结构给前端,类似这样的结构:下面就把相关表和代码分享给大家
- (1). 和反射+泛型有关的接口类型java.lang.reflect.Type:java语言中所有类型的公共父接口java.lang.re
- 最近公司项目中有一个类似滴滴出行填写验证码的弹框,下面是我撸出来的效果: 中间的那个输入密码的6个框框其实就是用shape画的背景
- 同步代码块基本语句synchronized (任意对象) {操作共享代码}代码示例public class SellTicket imple
- 例:Helloooooo => He2l6o/** * Run-Length编码(游长编码) * @author
- 一、概述UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NET框架通过UdpClie
- 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还
- 一、内存和寻址概述可编程设备包含微处理器和一定数量的临时存储空间。临时存储器被称为随机存取存储器(RAM)。RAM类似于宿舍里成排存物柜的存
- 判断是否为飞行模式: boolean isAirplaneMode = Settings.System.getInt(mConte
- Spring概述Spring就是为解决企业应用开发的复杂性而创建的,做为开源中间件,它使用基本的JavaBean来完成以前只可能有EJB(J
- 在8 里面Lambda是最火的主题,不仅仅是因为语法的改变,更重要的是带来了函数式编程的思想,我觉得优秀的程序员,有必要学习一下函数式编程的
- List集合概述List集合是一个元素有序(每个元素都有对应的顺序索引,第一个元素索引为0)、且可重复的集合。List集合常用方 * ist是
- 前言文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍!!
- 又是兴趣系列网上有很多自动强红包的例子和代码,笔者也是做了一些优化。先说说自己的两个个优势1.可以在聊天界面自动强不依赖于通知栏推送 2.可