C# 对用于调用mscorlib中的ToString()的对象进行不必要的强制转换
在C# 对用于调用mscorlib中的ToString()的对象进行不必要的强制转换,c#,object,resharper,virtual,tostring,C#,Object,Resharper,Virtual,Tostring,在StringWriter(mscorlib.dll)中,我找到了一个代码: private StringBuilder _sb; // (...) public override string ToString() { return ((object) this._sb).ToString(); } 我看不出有什么原因(我的R#也是如此,但有时是错的)ToString()是虚拟的,因此施法不会改变行为 这里正在进行什么样的优化 这里正在进行什么样的优化 没有。R#在这里是错的 既不显示
StringWriter
(mscorlib.dll)中,我找到了一个代码:
private StringBuilder _sb;
// (...)
public override string ToString()
{
return ((object) this._sb).ToString();
}
我看不出有什么原因(我的R#也是如此,但有时是错的)ToString()
是虚拟的
,因此施法不会改变行为
这里正在进行什么样的优化
这里正在进行什么样的优化
没有。R#在这里是错的
既不显示也不显示这个奇怪的演员阵容,我也没有在电影中找到它
所以代码只是
public override string ToString()
{
return this._sb.ToString();
}
这没有任何区别,也没有优化。生成的带和不带强制转换的IL完全相同。事实上,当用Reflector打开mscorlib时,它只会说
返回这个代码>
正如您所说,ToString()
是virtual
,并且在StringWriter
中没有标记为new
,因此生成的IL在任何情况下都引用Object.ToString()
(最初声明的方法)(某些基本值类型除外):
即使查看CLI 2.0源代码,代码如下所示:
public override String ToString() {
return _sb.ToString();
}
根据Reflector,唯一的区别是StringBuilder.ToString()
不安全。在IL中没有这个关键字,但是可以通过检查不安全的说明来找到它。R可能会认为这是一个差异(虽然不是),更喜欢显式。p> 通过反编译StringWriter
类,我得到的结果是:返回这个代码>。
public override String ToString() {
return _sb.ToString();
}