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.
Ciò che ottengo decompilando la classe 'StringWriter' è:' return this._sb.ToString(); '. –