都快2008年了,還是看到不少人在辛苦的用著IEnumerator遍歷某個數據結構。逢上foreach的“源代碼”,希望可以讓IEnumrator的funs徹底死心,呵呵。
還是反編譯(最近好上這個了,呵呵)如下的代碼:
ArrayList somelist = new ArrayList();
foreach(object o in somelist)
{
...
}
得到的IL代碼大致如下:
callvirt ...ArrayList::GetEnumerator()
...
callvirt ...IEnumerator::MoveNext()
...
brture.s 某個地址
...
callvirt ...Dispose()
上面的代碼依然被放到了try_finally塊裡面,由此可見foreach的源代碼應該如下:
IEnumerator ie = ArrayList.GetEnumerator();//此處代碼,隨使用的數據不同而不同,但是目的都是獲取IEnumerator接口
try
{
while(IE.MoveNext())
{
object o = IE.Current;
}
}
finally
{
IE.Dispose();
}
可見,foreach不僅僅是方便的遍歷了我們的數據結構,同時還進行了資源的釋放。如果手動調用IEnumerator的話,我相信很多人都沒有主動的調用Dispose吧。所以,foreach還是應該多多用啊。呵呵……