<分区>
在StringWriter
(mscorlib.dll)中我找到了一段代码:
private StringBuilder _sb;
// (...)
public override string ToString()
{
return ((object) this._sb).ToString();
}
我看不出原因(我的 R# 也是,但有时是错误的)。 ToString()
是 virtual
因此转换不会改变行为。
这里做了什么样的优化?
<分区>
在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()
是virtual
,在StringWriter
中没有标明new
,所以生成的 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()
不安全
。 IL中没有this的关键字,但是可以通过检查不安全指令发现。 R# 可能会认为这是一个区别(尽管它不是)并且更喜欢显式。
关于c# - 不必要地转换为用于在 mscorlib 中调用 ToString() 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15804800/