c# - 不必要地转换为用于在 mscorlib 中调用 ToString() 的对象

标签 c# object resharper virtual tostring

<分区>

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/

相关文章:

C# 存储输入文件中的字符串以供操作和使用的最佳方式?

javascript - 使文字对象具有参数?

c# - Resharper 源模板添加空语句

c# - 名为 'Item' 的列已属于此 DataTable

c# - HttpWebRequest 在 mono 和 .net 中的实现方式不同吗?

javascript - 我可以在 object.defineProperty() 上传递属性数组吗?

c# - 匿名类型到真实类重构

wpf - 如何使 Resharper 解析 CustomBinding MarkupExtension 的路径

c# - 在 Unity 中将通用存储库与 TEntity 结合使用

c++ - 在堆栈和堆上创建对象数组