2014-01-08 51 views
4

任何人都可以指出C#語句和它們相似的擴展方法之間的區別嗎?例如:foreach.ForEach(擴展方法)。C# - 「foreach」和擴展方法之間的區別:ForEach

如果有任何區別,它們是什麼?安全明智嗎?性能明智嗎?哪一個更好用?哪一個更安全?等

如果沒有差異,那麼爲什麼要寫他們呢?

我一直在思考和尋找一些關於這個問題,如果我並沒有找到我的答案。先謝謝了。

+8

[Eric Lippert的博客:「foreach」與「ForEach」](http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx) – MarcinJuraszek

+1

可能的重複[爲什麼IEnumerable接口沒有ForEach擴展方法?](http://stackoverflow.com/questions/101265/why-is-there-not-a-foreach-extension-method-on-the-ienumerable - 接口) –

+0

請注意,tehre不是框架中的「ForEach」擴展方法* - 最接近的是List .ForEach(已從Windows Store API中刪除) –

回答

4

這取決於您使用的擴展方法的實現。在內部,大多數版本的.ForEach並沒有什麼特別之處。

在應用程序加載和編譯時加載擴展方法的時間會有最小/可忽略的時間。有「可能」是最小的開銷,將.ForEach語法轉換爲基本的foreach,因爲它在技術上只是一個包裝。它可能會導致安全問題,但這僅僅是因爲它可以在預期的時間(例如:在範圍內保持更長的時間)內不會收集到對象時創建閉包系統。最終,它們之間的差別非常小,並歸結爲品味。當然,除非你試圖每毫秒削減一次,在這種情況下,使用本地機構是最好的選擇。

我想提一下,.ForEach打擊使用lambda語句的前提是純功能性的,也就是打破了「功能」風格並引入了副作用的可能性。使用foreach主體可以使代碼更具可讀性和明確性。

請參閱: Why there is no ForEach extension method on IEnumerable?

這是一個權衡。擴展方法當然更簡潔,並提供編譯時檢查。該擴展方法也會帶來可讀性困難,可維護性困難和副作用。

here

採取的第二個原因是,這樣做增加了新的零代表性 電源語言。這樣做可以讓你完全重寫這個 清除代碼:

foreach(Foo foo in foos){涉及foo的語句; }

到這個代碼:

foos.ForEach((美孚FOO)=> {聲明涉及FOO;});

它使用幾乎完全相同的字符略有不同 順序。然而第二個版本更難理解,難以調試,並且引入了閉包語義,從而潛在地以微妙的方式改變了對象的生命週期。

+0

在lambda語法中沒有純度的前提。 – Lee

+0

@Lee,「純粹功能」意義上的純度。我會做這個編輯。 –

+0

我在說lambda不是'純粹的功能性',它們對於匿名方法來說是短暫的,因此會產生副作用。 Linq本身促進純度,它通常與lambda一起使用,但lambda本身不會。 – Lee

0

.ForEachParallel.ForEach相似。我見過用於開發/調試並行版本的常規.ForEach。最好的是你不必改變一堆代碼在兩者之間移動。

一般來說,如果我沒有打算做Parallel.ForEach,那麼爲了便於閱讀,我更喜歡常規的foreach

相關問題