在平時開發程序中,陣列是我們使用頻率最高的型別之一,在使用定長串列時,陣列可以說是最佳方案,這也是我們最熟悉的資料結構之一,
在C#中使用陣列,可以獲取在記憶體上連續的相同型別的一組變數,在連續訪問時可以滿足CPU訪問暫存器的時間區域性和空間區域性,大大提高了對大量資料的訪問效率,但是在使用它時我們依然有一些需要注意的地方,
在對編譯時型別為陣列型別的物件進行foreach回圈時,編譯器會將該foreach回圈優化為for回圈,從而減少了迭代器的構造和其帶來的額外消耗,但是,如果我們對編譯時型別為IEnumerable型別、運行時型別為陣列型別的物件進行foreach回圈時,編譯器并不會進行上面的優化,因為編譯器并不知道該物件一定為陣列型別,因此沒有辦法進行優化,
對于下面的代碼:
int[] ints = new int[10]; int result = 0; foreach (var item in ints) { result += item; } IEnumerable enumerables = ints; foreach (var item in enumerables) { result += (int)item; }
對編譯時型別為陣列型別的ints變數進行遍歷時,生成的IL代碼為:

可以看到其對陣列的foreach回圈進行了for回圈優化,而編譯時型別為IEnumerable型別的enumerables變數進行遍歷時,生成的IL代碼為:

這里并沒有對其進行任何的優化,使用構造迭代器的方式進行回圈,
因此,在對陣列型別的物件進行foreach遍歷時,在必要時需要確保其編譯時型別即為陣列型別,確保其編譯器優化被使用,
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的認可是我寫作的最大動力!
作者:Minotauros
出處:https://www.cnblogs.com/minotauros/
本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/84731.html
標籤:C#
上一篇:C#序列化與反序列化學習筆記
下一篇:動手造輪子:寫一個日志框架
