C#中foreach及List.ForEach()方法的区别(包含ForEach的缩写)

前言
之前一直觉得C#中foreach循环和集合的ForEach()这个循环方法是没有什么区别,只是写法不同,但是在我最近的使用中,发现ForEach()方法还是和foreach循环存在一些区别的,今天在这里记录下;

差别
众所周知 在C#和java中具有三个神奇的关键字 return; continue和break;而这三个的区别在这都不讲了,之所以要说这三个关键字 就是因为在使用ForEach()的时候这个方法居然只支持return 这个关键字,而不支持continue和break; 而且在ForEach()方法里面当你使用return的时候并不是返回,而是类似于continue 终止当前循环,执行集合中的下一个元素,而当我F12查看ForEach()方法的时候才发现了一个我一直忽略的事情,那就是委托;

原因
其实原因很简单,List<T>.ForEach()方法的参数是一个Action<T>的委托,而 Action委托是没有返回值的,所以当我们在使用ForEach()方法的时候可以理解为每次循环都在调用一个void方法,而当我们再循环的方法里使用return 的时候其实就是直接结束掉这个方法,执行集合中的下一个元素;而foreach循环说到底是写在方法内部的一个循环体,所以当我们调用return的时候也是直接结束掉了循环体所在的方法;
下面的代码可能更方便理解

List<int> a = new List<int> { 1, 2, 3 };
         a.ForEach(item =>
          {
               if(item=1)
               {
               return;
               }
          });
         //上面的代码相当于下面这样一个实现
         foreach(int item in a)
         {
            test(item)
         }

           void test(int item)
           {
                  if(item==1)
                  {
                  return;
                  }
          }

return在两种方法中应用的区别

所以,看到这里,我们应该可以看出,两种方法的不同了,所以 return 在这两种方法里面所展现的区别就显而易见了!
0.在 foreach() 里,return 所起到的作用是 是跳出整个方法,也就是 当你在 foreach()里面使用 return的时候,
他就会跳出 foreach 所在的整个方法,从而直接结束该方法的运行。
1.在 Lsit<T>.foreach() 方法里面使用 retrun 的话,我们可以从上面的代码看出,这个方法实际上是运用委托,
在方法里面去运行另外一个方法,换句话说,就是我们用foreach 去循环执行了这个方法,而这个时候我们去使用 return 的话,
它所返回跳出的方法,仅仅是被循环执行的那个方法,也就是委托定义的那个方法,而返回出那个方法以后,循环会认为是该方法已经执行完毕,
从而进行下一次循环,所以,我们在List<T>.foreach()所执行的return 实际上和在 foreach()里面执行 continue 一样!

(0)

相关推荐

  • MyBatis xml foreach循环语句

    MyBatis很好的支持批量插入,使用foreach即可满足 首先创建DAO方法: package com.youkeda.comment.dao; import com.youkeda.commen ...

  • 科技·Kotlin从入门到精通,循环控制

    循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体.循环语句是由循环体及循环的终止条件两部分组成的.For循环for循环可以对任何提供迭代器(iterator)的对象进行遍 ...

  • 为什么许多程序员从来都不用break或者continue语句?

    你好,我是只说代码的大饼,我来回答下你问题. 我觉得问题应该改下,哪些类型的程序员不用常用.或者不用break或者continue关键字? 进入正题,我分如下几点分析下: 一.不用或者不常用break ...

  • mybatis执行批量更新batch update 的方法(oracle,mysql)

    oracle和mysql数据库的批量update在mybatis中配置不太一样: oracle数据库: <updateid="batchUpdate" parameterTy ...

  • Python中实现二分查找的2种方法?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • (7条消息) C++中位运算的使用方法

    一:简介1 位逻辑运算符:& (位   "与")  and^  (位   "异或")|   (位    "或")   or~  (位 ...

  • 关于定岗定编中定岗的工具和方法

    年底了,很多组织的HR都在忙着做定岗定编的事情,这是人力资源规划的基础源点,当然这也是一个很复杂的工作,尤其是现代组织形态变化多样,貌似都没有规矩可循,但是古老的方法依然还是有用的,为了把定岗定编说透 ...

  • 卤水配方中你不知道的香料的使用方法及功效,谨慎收藏!

    配方中香料使用方法: 1.各种粉料:不管任何配方,使用粉料每1斤水放1克左右的复合香粉,拌馅料1斤肉放香料2克左右:以此类推 2.卤肉大块料:可以打成粗粉混合使用:按1斤肉3斤水计算,放复合香料4克左 ...

  • 详解六爻八卦预测中占应期的方法

    自古至今,关于测卦都重视吉凶的应期,何谓应期?应期就是你所测之事发生的日期,或年或月或日或时.即所谓的"远应年月;近应日时". 关于应期者,众说纷纭,方法也很多,很复杂,生世生用神 ...

  • 太极拳训练中寻找“劲点”的方法你知道哪些?

    何为太极拳的劲点呢? 简言之就是指你发力的刚落点,(刚落点可以发出来,也可以含而不发)这个落点必须符合以下条件: (一)这个刚落点是可以控制的,可以驾驭的,是力臂可达之内的任一点. (二)这个刚落点, ...

  • 盲派中分析八字做功的方法

    在八字命理之中,相信我们都知道盲派,我们可以理解的是盲人算命的绝学,对于命理解析是有着很重要的地位. 那么在盲派之中是如何分析八字的做功呢,下面我们一起来看看吧. 盲派中分析八字做功的方法 1.看日干 ...

  • 书法知识,毛笔中的八种用笔方法如何运用?听听老师的讲解吧

    书法知识,毛笔中的八种用笔方法如何运用?听听老师的讲解吧

  • 杨志明——解析几何解题中的“设而不求”方法

    解析几何解题中的"设而不求"方法 (5)本公众号对优秀作者和名师一般会附上"作者简介",以让广大读者更好地了解作者的研究成果和方向,以便进一步学习作者的相关数学 ...

  • 学校课程规划中课程目标的厘定方法

    科学且准确地厘定学校的课程目标是构建学校课程整体规划重要的环节.课程目标是否准确,对于科学地规划学校课程体系具有重大的意义.学校课程目标是育人目标在课程领域中的反映,是基于国家和地方的课程目标体系,经 ...