C#中foreach及List.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 一樣!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM