c#使用foreach需要知道的


    在c#中通過foreach遍歷一個列表是經常拿用的方法,使用起來也方便,性能上也和for沒有多大的差別;那為什么還要注意呢?我們先下來看下以下這句話:分配的內存數量和完成測試所需的時間之間有直接關系。當我們單獨查看的時候,內存分配並不是非常昂貴。但是,當內存系統只是偶爾清理不使用的內存時,問題就出現了,並且問題出現的頻率和要分配的內存數量成正比。因此,你分配越多的內存,對內存進行垃圾回收的頻率就越頻繁,你的代碼性能就會變得越差。

    從上面那些話可以看到內存的回收是非常損耗資源,那我們再看下一些.net內部類型的實現。

Array:

// System.Array
public IEnumerator GetEnumerator()
{
	int lowerBound = this.GetLowerBound(0);
	if (this.Rank == 1 && lowerBound == 0)
	{
		return new Array.SZArrayEnumerator(this);
	}
	return new Array.ArrayEnumerator(this, lowerBound, this.Length);
}
List<T>:
// System.Collections.Generic.List<T>
public List<T>.Enumerator GetEnumerator()
{
	return new List<T>.Enumerator(this);
}
 
Dictionary<TKey, TValue>:
// System.Collections.Generic.Dictionary<TKey, TValue>
public Dictionary<TKey, TValue>.Enumerator GetEnumerator()
{
	return new Dictionary<TKey, TValue>.Enumerator(this, 2);
}
從以上代碼來看,我們再進行foreach操作以上對象的時候都會構建一個Enumerator;也許有人會認為這點東西不需要計較,不過的確很多情況是不用關心;但如果通過內存分析到到的結果表明構建Enumerator的數量排在前幾位,那就真的要關心一下了。很簡單的一個應用假設你的應用要處理幾W的並發,而每次都存在幾次foreach那你就能計算出有多少對象的產生和回收?看下一個簡單的分析圖,這里緊緊是存在一個List'1如果組件內部每個並發多幾個foreach又會怎樣?

改成for的結果又怎樣呢


免責聲明!

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



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