冗余ToString代码?

时间:2012-10-31 11:40:47

标签: c# .net resharper

我在想:

编写此代码:

 DataRow[] g = new DataRow[1] ;
 var t=new StringBuilder().AppendFormat("{0}", g[0]["aaa"].ToString());

Resharper表现得像:(注意灰色)

enter image description here

enter image description here

请提出3个问题

1)删除ToString(),如何在不调用已移除的ToString()的情况下输出其显示字符串?

2)是否建议删除它,因为已经在内部调用它?还是因为另一个原因?

3)不删除ToString(),它会调用两次吗?

2 个答案:

答案 0 :(得分:8)

是的,这是多余的,因为AppendFormat(如String.Format)在内部已将其转换为字符串,而String.ToString始终是多余的。

实际上它在每个提供的参数上使用ICustomFormatter.Format方法。

在无用方面也是多余的。因此,即使不需要多次执行任何工作(AppendFormat也不会尝试将字符串转换为字符串),因为AppendFormat 无论如何它都是没有意义的。因此,resharper试图在这里简化你的代码。

答案 1 :(得分:4)

您可能希望看到:Composite Formatting

处理订单

  

参数列表中与格式项对应的每个值都是   通过执行以下列表中的步骤转换为字符串。   如果前三个步骤中的任何条件为真,则为字符串   在该步骤中返回值的表示,然后返回   步骤没有执行。

     
      
  1. 如果要格式化的值为null,则返回空字符串("")。
  2.   
  3. 如果复合格式化方法包含IFormatProvider类型的参数,该参数也实现了ICustomFormatter接口,   该值将传递给ICustomFormatterFormat方法。
  4.   
  5. 如果值实现IFormattable接口,则调用其IFormattableToString方法。
  6.   
  7. 调用类型的ToString方法,该方法被重写或从Object类继承。
  8.   

虽然DataRow似乎继承自System.Object而且没有implmenet IFormatProviderIFormattableToString,所以我相信,它的ToString方法被称为在内部获取字符串表示,并且明确.ToString被认为是多余的。