这个c#return语句在性能方面是好还是坏?

ACP*_*ACP 1 c# string return

我的静态方法返回如下的串联字符串

return (Sb.ToString() + " " + ds.Tables[1].Rows[0].ItemArray[0].ToString() + " " + ds.Tables[2].Rows[0].ItemArray[0].ToString());

这是一个好/坏的做法,还是我应该使用stringbuilder ....

Jon*_*eet 9

单个镜头中的字符串连接将比使用a更快StringBuilder- 尽管如果Sb已经是a StringBuilder,则可能有意义地追加到它(假设它是局部变量).假设这实际上是来自数据库的数据,那么获取它所花费的时间将大大超过此处的字符串连接.

请注意,您不需要所有这些调用ToString()- 这也可以:

return (Sb + " " + ds.Tables[1].Rows[0].ItemArray[0] + " " + 
        ds.Tables[2].Rows[0].ItemArray[0]);
Run Code Online (Sandbox Code Playgroud)

这是使用现有构建器的等效项:

return Sb.Append(" ")
         .Append(ds.Tables[1].Rows[0].ItemArray[0])
         .Append(" ")
         .Append(ds.Tables[2].Rows[0].ItemArray[0])
         .ToString();
Run Code Online (Sandbox Code Playgroud)

可能会稍快一点 - 这将取决于各种事情.就个人而言,我可能会使用连接版本,因为它的IMO稍微简单一些.我非常怀疑你会发现性能差异很大.请注意,这是一个特例,因为你已经有了StringBuilder; 在连接一组项目的一般情况下,它们都可以在一个编译时表达式中指定,连接可以更快,因为单个方法调用可以提供所有必需的信息.

如果您需要更多详细信息和指南,我有一个关于StringBuildervs字符串连接页面.

  • @Filip:是的,它会更快.它将导致对`String.Concat`的单个调用,它可以查看所有*所涉及的字符串的长度,计算出所需缓冲区的确切大小,将它们全部复制,然后就完成了.不需要额外的`StringBuilder`对象; 没有扩展缓冲区(可能涉及更多的重新分配).使用`StringBuilder`绝对不是*最佳实践,而不理解为什么它*有时*效率更高. (5认同)