在StringWriter
(mscorlib.dll)中,我找到了一个代码:
private StringBuilder _sb;
// (...)
public override string ToString()
{
return ((object) this._sb).ToString();
}
我看不出这样做的原因(我的 R# 也是如此,但有时它是错误的)。ToString()
所以virtual
铸造不会改变行为。
这里正在进行什么样的优化?
它没有任何区别,也没有优化。生成的带和不带强制转换的 IL 完全相同。事实上,当使用 Reflector 打开 mscorlib 时,它只显示return this._sb.ToString();
.
如您所说,ToString()
is virtual
,并且没有标记new
in 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();
}
根据反射器的唯一区别StringBuilder.ToString()
是unsafe
。在 IL 中没有 this 的关键字,但是可以通过检查不安全的指令来找到它。R# 可能会认为这是一个区别(尽管不是),并且更喜欢明确。
这里正在进行什么样的优化?
没有任何。R# 在这里是错误的。
ILSpy和JustDecompile都没有显示这个奇怪的演员表,我也没有在参考源代码中找到它。
所以代码只是
public override string ToString()
{
return this._sb.ToString();
}