幾天前,在寫溢出的this question的回答時,我對C#編譯器感到有些驚訝,他沒有按照我預期的那樣做。請看下面的代碼片斷:C#編譯器不會優化不必要的轉換
第一:
object[] array = new object[1];
for (int i = 0; i < 100000; i++)
{
ICollection<object> col = (ICollection<object>)array;
col.Contains(null);
}
第二:
object[] array = new object[1];
for (int i = 0; i < 100000; i++)
{
ICollection<object> col = array;
col.Contains(null);
}
在兩個片段之間的代碼唯一的區別是鑄造到ICollection的<對象>。由於object []明確實現了ICollection對象>接口,因此我期望這兩個片段可以編譯爲相同的IL,因此是相同的。然而,在對它們進行性能測試時,我發現後者的速度是前者的6倍。
比較兩個片段的IL後,我注意到兩種方法都是相同的,除了castclass IL指令在第一個片段中。
感到驚訝,我現在想知道爲什麼C#編譯器不是'聰明'在這裏。事情並不像看起來那麼簡單,那麼爲什麼C#編譯器在這裏有點天真?
你使用了哪些編譯器選項? – Richard 2010-02-07 12:58:57
以發佈模式編譯(優化代碼開啓)。 – Steven 2010-02-07 13:16:12