11

StringWritermscorlib.dll)中,我找到了一个代码:

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

我看不出这样做的原因(我的 R# 也是如此,但有时它是错误的)。ToString()所以virtual铸造不会改变行为。

这里正在进行什么样的优化?

4

2 回答 2

3

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

如您所说,ToString()is virtual,并且没有标记newin 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# 可能会认为这是一个区别(尽管不是),并且更喜欢明确。

于 2013-04-04T07:47:45.917 回答
1

这里正在进行什么样的优化?

没有任何。R# 在这里是错误的。

ILSpy和JustDecompile都没有显示这个奇怪的演员表,我也没有在参考源代码中找到它。

所以代码只是

public override string ToString()
{
    return this._sb.ToString();
}
于 2013-04-04T07:47:20.950 回答