《Effective C#》Item 11:提倡使用foreach语句来进行循环操作

直流电动机的建模仿真(1)他励,串励和并励电动机建模仿真 本文根据不同励磁方式的直流电动机的接线原理图,建立了相应的数学模型,然后根据与数学模型对应的等效电路以及模拟机械运动方程的等效电路,用Matlab/simulink中的SpecializedPower system库中的电路元件,建立了他励,并励和串励直流电动机的全等效电路仿真模型,经过与Matlab自带的直流电动机仿真模型比较以及仿真实例验证,所建立的仿真模型时完全正确的。 阅读详情

循环语句是编程的基本语句,在C#中除了沿用C语言的循环语句外,还提供了foreach语句来实现循环。那么我要说的就是,在循环操作中尽量使用foreach语句来实现。

 

为了来更好地说明为什么要提倡使用foreach,用如下三种不同方式来编写循环语句。

        int[] nArray = new int[100];

 

        // Use "foreach" to loop array

        foreach( int i in nArray )

            Debug.WriteLine( i.ToString() );

 

        // Use "for" to loop array

        for( int i = 0; i < nArray.Length; i++ )

            Debug.WriteLine( nArray[i].ToString() );

 

        // Another way using "for" to loop array

        int nLength = nArray.Length;

        for( int i = 0; i < nLength; i++ )

            Debug.WriteLine( nArray[i].ToString() );

 

很明显,foreach语句很简洁,但是它的优点不仅仅在于此,它的效率也是最高的。可能很多人认为最后一种的效率会更高,因为表面上看着不用每次访问引用类型的属性。可是它却是三者当中,效率最低的。因为C#是强类型检查,那么对于数组访问的时候,要对索引的有效值进行判断,那么对于最后一种代码实际产生的效果如同下面的代码一样。

        // Another way using "for" to loop array

        int nLength = nArray.Length;

        for( int i = 0; i < nLength; i++ )

        {

            if( i < nArray.Length )

                Debug.WriteLine( nArray[i].ToString() );

            else

                throw new IndexOutOfRangeException();

        }

(书中这里有些出入,经过网友sozdream的提示,在1.1环境下发现最后一种方法是最快的,前两者的速度基本相等;通过Dissambly查看最后一种循环方法所产生的代码,并没有产生类似于文章所说的那种索引检查。不过还是不建议使用最后一种,因为此方法对索引的判断有些脱节,尤其是当循环中数组尺寸发生变化的时候,索引有效检查无法及时进行)

 

foreach语句除了简洁和高效外,还有很多优点,接下来一一列举。

 

第一个就是不用考虑数组起始索引是几,很多人可能从其他语言转到C#的,那么原先语言的起始索引可能不是1,例如VB或者Delphi语言,那么在C#中使用数组的时候就难免疑问到底使用0开始还是用1开始呢,那么使用foreach就可以避免这类问题。

 

第二个好处就是对于多维数组操作用foreach就非常简便了,例如:

        int[,] nVisited = new int[8,8];

        // Use "for" to loop two-dimension array

        for( int i = 0; i < nVisited.GetLength(0); i++ )

            for( int j = 0; j < nVisited.GetLength( 1 ); j++ )

                Debug.WriteLine( nVisited[i,j].ToString() );

 

        // Use "foreach" to loop two-dimension array

        foreach( int i in nVisited )

            Debug.WriteLine( i.ToString() );

 

对于三维或更多维,foreach语句不用发生任何变化,而对于for语句来说就要进行修改了,这里就不多说了。

 

第三个要说的就是foreach完成类型转换操作,这种体现可能通过如上的例子看不出任何效果,但是对于ArrayList之类的数据集来说,这种操作就显得比较突出,例如:

        // Init an arraylist object

        int[] nArray = new int[100];

        ArrayList arrInt = new ArrayList();

        arrInt.AddRange( nArray );

 

        // Use "foreach" to loop an arraylist

        foreach( int i in arrInt )

            Debug.WriteLine( i.ToString() );

 

        // Use "for" to loop an arraylist

        for( int i = 0; i < arrInt.Count; i++ )

        {

            int n = ( int ) arrInt[i];

            Debug.WriteLine( n.ToString() );

        }

 

最后要说的是使用foreach并没有增加资源使用,这句话听得有些难懂,由于对于继承了IEnumerable接口的类型数据,才能使用foreach语句,那么对于使用foreach会访问IEnumerable接口中GetEnumerator方法来进行枚举,那么对于如上的foreach语句,对应的语句其实如下:

        IEnumerator it = arrInt.GetEnumerator() as IEnumerator;

        using( IDisposable disp = it as IDisposable )

        {

            while( it.MoveNext() )

            {

                int elem = ( int )it.Current;

                Debug.WriteLine( elem.ToString() );

            }

        }

 

也就是说在出了foreach之后对于IEnumerator的对象也进行Dispose处理。

 

对于foreach说了这么多好处,那么在使用它是否可以无懈可击呢。其实不是这样的,在foreach语句中有两个限制,第一不能修改枚举成员,其次不要对集合进行删除操作。也就是如下两种方式都是错误的。

        // Use "foreach" to loop an arraylist

        foreach( int i in arrInt )

        {

            i++;//Can't be compiled

            Debug.WriteLine( i.ToString() );

        }

 

        // Use "foreach" to loop an arraylist

        foreach( int i in arrInt )

        {

            arrInt.Remove( i );//It will generate error in run-time

            Debug.WriteLine( i.ToString() );

        }

 

那么对于如上两个操作,可以用for来实现,此外这里多说一句,就是对于一个记录集的多条数据删除问题,也是经常出现问题的地方(论坛上经常问类似的问题),由于在一些记录集中进行删除的时候,在删除操作之后相应的索引也发生了变化,这时候的删除要反过来进行删除,大致形式如下。

        // Use "for" to loop an arraylist

        for( int i = arrInt.Count - 1; i >=0; i-- )

        {

            int n = ( int ) arrInt[i];

            if( n == 5 )

                arrInt.RemoveAt( i ); // Remove data here

            Debug.WriteLine( n.ToString() );

        }

 

除了这两个地方外,foreach可以基本适用于任何循环,因此对于循环的编写要尽量使用foreach,因为它会使你的代码清晰简洁,又不失高效。

深入解析BLheli电调固件与Dshot通讯协议:从原理到实践 本文深入解析了无人机动力系统的核心——BLheli电调固件与Dshot通讯协议。详细阐述了BLheli固件从经典版到BLheli_32的演进及其功能特性,并重点剖析了Dshot数字协议如何通过数据包和校验码实现更快、更准、更可靠的电机控制。文章还涵盖了双向Dshot遥测、实战配置与调参指南,帮助玩家充分释放无人机性能。 阅读详情

相关推荐

摄像头读取出现VIDIOC_STREAMON: No space left on device 错误

先说下原因,linux中为usb camera提供了一个标准的V4L2的驱动以方便使用,只要符合驱动规范就可以实现即插即用usb camera设备,即免驱动安装。 但市面上的USB 摄像头都是2.0的。usb bus的 bandwidth是有限的,而V4L2驱动采用的是贪心原则,即camera会要求获取最大带宽;因此将两个camera接入一路usb bus,打开第二个camera(尤其是采用YUV...

houge101的博客 9289

forEach的三种用法

// forEach的三种用法: //1.直接forEach遍历 for(int i:list){ System.out.println(i); } //2.用system.out::println list.forEach(System.out::println); //3.有map集合 键值对的情况下 set.forEach((key) -> { System.out....

mrsimpleLi的博客 3万+

从毫米波到计算机视觉:智能座舱监控系统的多模态技术融合

本文探讨了智能座舱监控系统中多模态技术融合的创新应用,涵盖毫米波雷达、红外传感与计算机视觉的协同架构。通过传感器时空对齐、低光照算法突破及隐私保护设计,系统在DMS、OMS等场景实现99.7%的检测准确率,同时优化成本至$45以内,为汽车智能化提供关键技术支撑。

d6e7f8的博客 902

forEach() 的用法

forEach() 的用法

qq_37194189的博客 3700

ENVI 5.3与IDL 8.5安装指南:从下载到激活的完整流程

本文提供了一份详细的ENVI 5.3与IDL 8.5安装教程,涵盖从获取安装包、运行主程序、安装许可证到关键文件替换的完整流程。指南重点解决了激活过程中的常见问题,并分享了个人实践经验,旨在帮助用户,特别是遥感图像处理初学者,一次性顺利完成软件部署,为后续的科研与开发工作奠定基础。

weixin_29213827的博客 545

基于Zemax的干涉仪仿真——Fizeau球面干涉仪

最近在用Zemax仿真干涉仪,在这之前查资料都是关于一些平面干涉仪的仿真,很少有关于Fizeau型的,尤其是球面干涉仪的仿真,看到很多关于这方面的问题回复都说利用多重结构仿照Zemax马赫-泽德干涉仪去做,但是也没有具体的过程,因此在这里分享一下我仿真的干涉仪步骤方法,具体是利用多重结构完成的仿真。

weixin_46657737的博客 6409

c#foreach循环用法详解

foreach 语句经常与数组一起使用,在 C# 语言中提供了 foreach 语句遍历数组中的元素,具体的语法形式 如下。 foreach(数据类型 变量名 in 数组名) { //语句块; } C# foreach 循环用于列举出集合中所有的元素,foreach 语句中的表达式由关键字 in 隔开的两个项组成。 in 右边的项是集合名,in 左边的项是变量名,用来存放该集合中的每个元素。 该循环的运行过程如下: 每一次循环时,从集合中取出一个新的元素值。放到只读变量中去,如果括号中.

opencv220的博客 1万+

YOLOv8 + TensorRT 实战:手把手教你用 C++ 实现实时视频流目标检测(附完整项目代码)

本文详细介绍了如何将YOLOv8与TensorRT结合,通过C++实现实时视频流目标检测的全流程。从环境配置、模型转换优化到视频处理架构设计,手把手教你构建高性能检测系统,并附完整项目代码。特别针对Windows平台下的TensorRT模型加速部署提供了实用技巧和性能优化方案。

weixin_29051193的博客 345

【JavaScript】`forEach` 方法的详解与实战

方法是数组对象的重要组成部分。它提供了一种简洁、优雅的方式来遍历数组中的每个元素,并对其执行指定操作。方法的基本概念、用法、常见的应用场景、与其他遍历方法的对比,并提供实战示例,帮助您全面掌握这一强大的工具。方法的回调函数还可以接收当前元素的索引和原数组作为参数。数组中的每个元素执行回调函数,并将当前元素作为参数传递给回调函数。方法用于遍历数组,并对每个元素执行一次给定的回调函数。回调函数的纯粹性,避免对外部状态的修改,从而提高代码的可维护性。回调中直接修改原数组的结构,避免意外的副作用。

lph159的博客 3万+

DICOM标准:DICOM医学影像中的覆盖层(Overlay)概念详解

DICOM标准:深入详解DICOM医学影像中的覆盖层(Overlay)

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1562

第1课:开篇扫盲——OpenClaw是什么?能帮你解决什么问题?(入门必看)

核心目标:学会安装、卸载、管理OpenClaw技能,自定义AI代理的性格与权限,让AI贴合自己的使用习惯。核心内容技能市场详解:ClawHub市场核心技能分类(办公、学习、开发、生活),热门技能推荐(web-search、文件处理、邮件管理)[superscript:3][superscript:4]。技能安装与卸载:终端命令实操(openclaw skill install/uninstall),技能更新与版本管理[superscript:3]。

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 1756

JAVA java学习(34)——————java流程控制之循环结构(for循环增强型:foreach语句)

foreach 循环语句是 Java 1.5 的新特征之一,在遍历数组、集合方面,foreach 为开发者提供了极大的方便。foreach 循环语句是 for 语句的特殊简化版本,主要用于执行遍历功能的循环。 Java 增强 for 循环语法格式如下: for(类型 变量名:集合) { 语句块; } 其中,“类型”为集合元素的类型,“变量名”表示集合中的每一个元素,“集合”是被遍历的集合对象或数组。每执行一次循环语句,循环变量就读取集合中的一个元素,其执行流程如图所示。 假设有一个数组,采用 f

qq_43434300的博客 1185

zynq的vitis工程烧录到Winbond(华邦)型号W25Q256JVEQ的QSPI FLAHS

vitis2023.1直接支持W25Q256JVEQ。

FPGA艺术家的博客 676

转:《Effective C#》Item 11:提倡使用foreach语句来进行循环操作

转:http://dev.youkuaiyun.com/author/Knight94/424b8da0b1ce42abbcbbfed0eba2c402.html#Comment《Effective C#》Item 11:提倡使用foreach语句来进行循环操作 循环语句是编程的基本语句,在C#中除了沿用C语言的循环语句外,还提供了foreach语句来实现循环。那么我要说的就是,在循环

flyskylf的专栏 551

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Effective C# Item 11: Prefer foreach Loops

Effective C#Item 11: Prefer foreach Loops 在C#中相比for或者while循环,foreach循环能为任意的集合生成最好的循环代码。它的定义基于.Net Framework中关于集合的接口,C#的编译器可以为不同类型的集合生成最合适的代码。当我们遍历集合时,应当使用foreach来代替其他循环结构。下面是三种循环的代码: int...

aijinyao5713的博客 160

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Effective C# Item11:优先采用foreach循环语句

C#针对循环提供了一种新的形式:foreach,它和.NET框架中的集合接口密切联系。我们在程序中,应该优先使用foreach进行循环。     来看下面的代码片段

尹自强.DoSomething() 463

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Effective C# Chapter 1 小结

经过了将近一个月的时间,终于完成了第一章的学习 + 翻译。第一章的内容是比较基础的,大部分内容可以看成是在讲如何养成良好的编程习惯。除了GetHashCode()那一节之外,其他的内容都是经常会用到的编程技巧。分辨引用和值类型、4种Equals()之间的关系等等也是.Net的基础知识。 还有对于Item 11: Prefer foreach Loops 中fore...

aijinyao5713的博客 146

Item 3: Prefer the is or as Operators to Casts(Effective C#)

  Remember that user-defined conversion operators operate only on thecompile-time type of an object, not on the runtime type.  Now that you know to use as when possible, let’s discuss when you can’t...

weixin_30558305的博客 139

C#学习资料《Effective C#》

Item 1: Always Use Properties Instead of Accessible Data Members《Effective C#》Item 1:用属性来访问类的私有成员http://blog.youkuaiyun.com/knight94/archive/2006/06/04/772886.aspxItem 2: Prefer readonly to const《Effectiv

SharpRose的专栏 1232

[MAF预定义的AIContextProvider-10]TodoProvider:用TodoList驱动Agent的任务执行

该文介绍了一种解决大型语言模型(LLM)执行多步骤复杂任务时注意力涣散问题的方法——使用TodoList机制。通过创建TodoList记录任务步骤,并在每完成一步后标记状态,可有效避免步骤遗漏或重复。文章以自动化部署为例,展示了如何通过TodoProvider和四个工具函数(PullLatestCode、BuildDockerImage等)实现可靠的多步骤部署流程。代码示例演示了Agent如何严格按TodoList顺序执行,并在每步完成后调用标记功能,最终输出清晰的部署结果和状态报告,显著提升了复

JaydenAI的博客 513
上一篇: 《Effective C#》Item 10:小心GetHashCode函数所存在的陷阱
下一篇: 《Effective C#》Part I:第一部分总结
Knight94
博客等级 码龄25年 1013粉丝 87原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值