2013-04-04 51 views
11

StringWritermscorlib.dll中)我發現了一個代號:不必要的鑄件在mscorlib程序調用toString()

private StringBuilder _sb; 
// (...) 
public override string ToString() 
{ 
    return ((object) this._sb).ToString(); 
} 

我看不出原因是什麼(所以我的R·但它有時是錯誤的)。 ToString()virtual所以鑄件不會改變行爲。

這裏正在做什麼樣的優化?

+0

我通過反編譯StringWriter類得到的是:'return this._sb.ToString();'。 – 2013-04-04 07:46:30

回答

3

它沒有任何區別,也沒有優化。生成的IL有無轉換完全相同。事實上,當使用Reflector打開mscorlib時,它只能表示return this._sb.ToString();

至於你說,ToString()virtual,並且它沒有被標記在StringWriternew,所以所生成的IL指Object.ToString()(最初聲明的方法)在任何情況下(除一些基本值類型):

ldfld class System.Text.StringBuilder System.IO.StringWriter::_sb 
callvirt instance string System.Object::ToString() 

即使在看CLI 2.0源代碼,該代碼是下面的:

public override String ToString() { 
    return _sb.ToString(); 
} 

根據反射器的唯一的區別在於StringBuilder.ToString()unsafe。 IL中沒有關鍵字,但可以通過檢查不安全的指令找到它。 R#可能會認爲這是一個區別(雖然不是),並且傾向於明確。

1

這裏正在做什麼樣的優化?

無。 R#在這裏只是錯誤的。

ILSpy也沒有JustDecompile顯示這個奇怪的演員,我也沒有在reference source code找到它。

因此,代碼只是

public override string ToString() 
{ 
    return this._sb.ToString(); 
} 
相關問題