不必要的转换到用于在mscorlib中调用ToString()的对象

Krz*_*nek 11 c# resharper virtual object tostring

StringWriter(mscorlib.dll)中我找到了一个代码:

private StringBuilder _sb;
// (...)
public override string ToString()
{
  return ((object) this._sb).ToString();
} 
Run Code Online (Sandbox Code Playgroud)

我没有看到原因(我的R#也是如此,但它有时是错误的).ToString()virtual如此铸造不会改变行为.

这里做了什么样的优化?

Bot*_*000 3

没有任何区别,也没有优化。生成的 IL(带强制转换和不带强制转换)完全相同。事实上,当用 Reflector 打开 mscorlib 时,它只显示return this._sb.ToString();.

正如你所说,ToString()is ,并且在 中virtual没有被标记,所以生成的IL在任何情况下都引用(最初声明的方法)(除了一些基本值类型):newStringWriterObject.ToString()

ldfld class System.Text.StringBuilder System.IO.StringWriter::_sb
callvirt instance string System.Object::ToString()
Run Code Online (Sandbox Code Playgroud)

即使查看CLI 2.0源代码,代码如下:

public override String ToString() {
    return _sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

根据 Reflector 的说法,唯一的区别StringBuilder.ToString()unsafe。IL 中没有针对此的关键字,但可以通过检查不安全指令来找到它。R# 可能会认为这是一个差异(尽管事实并非如此)并且更喜欢明确地表达出来。