Ответ 1
Это не имеет никакого значения, и оптимизации нет. Сгенерированный ИЛ с и без литья точно такой же. Фактически при открытии mscorlib с Reflector он говорит только return this._sb.ToString();
.
Как вы сказали, ToString()
есть virtual
, и он не помечен new
в StringWriter
, поэтому сгенерированный 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();
}
Единственное отличие от Reflector заключается в том, что StringBuilder.ToString()
- unsafe
. В IL нет ключевого слова для этого, но его можно узнать, проверив небезопасные инструкции. R # может считать это разницей (хотя это не так) и предпочитает идти явно.