2013-04-04 5 views
11

In StringWriter (mscorlib.dll) ho trovato un codice:fusione Inutile oggetto utilizzato per chiamare ToString() in mscorlib

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

non vedo ragione per questo (così è il mio R # , ma a volte è sbagliato). ToString() è virtual così il casting non cambia comportamento.

Che tipo di ottimizzazione viene eseguita qui?

+0

Ciò che ottengo decompilando la classe 'StringWriter' è:' return this._sb.ToString(); '. –

risposta

3

Non fa alcuna differenza e non v'è alcuna ottimizzazione. L'IL generato con e senza cast è esattamente lo stesso. Infatti quando si apre mscorlib con Reflector, si dice solo return this._sb.ToString();.

Come detto, ToString() è virtual, e non è contrassegnato new in StringWriter, così l'IL generato riferisce alla Object.ToString() (metodo inizialmente dichiarata) in ogni caso (ad eccezione di alcuni tipi di valore di base):

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

Anche guardando il codice sorgente CLI 2.0, il codice è il seguente:

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

l'unica differenza in base al riflettore è che StringBuilder.ToString() è unsafe. Non c'è una parola chiave per questo in IL, ma può essere scoperto controllando le istruzioni non sicure. R # potrebbe considerare questa differenza (anche se non lo è) e preferire l'esplicitazione.

1

Che tipo di ottimizzazione viene eseguita qui?

Nessuno. R # è semplicemente sbagliato qui.

ILSpyJustDecompile mostrano questo strano cast e anch'esso non lo trovo nello reference source code.

Così il codice è solo

public override string ToString() 
{ 
    return this._sb.ToString(); 
} 
Problemi correlati