【问题标题】:Is it better to use string.concat or string builder?使用 string.concat 或 string builder 更好吗?
【发布时间】:2017-01-19 16:36:06
【问题描述】:

使用 string.concat 或 string builder 更好吗?谁能解释一下我应该在什么情况下使用这两个?

有一个问题here,解释了性能,我想了解在哪里使用 string.concat 以及在哪里避免它?

提前致谢。

【问题讨论】:

  • String.Concat 使用StringBuilder,所以它们大致相等
  • 如果您在循环中连接或对 Concat() 进行大量单独调用,请使用 StringBuilder,否则您可以使用 String.Concat()
  • 如果您已经拥有所有想要合并的值(在List<String>String[] 或其他类型的IEnumerable<string> 中)使用String.Concat。如果您需要确定要附加的字符串(例如,在带有附加逻辑的循环中),请使用您自己的 StringBuilder。否则,您将在 Concat 中创建许多不必要的 StringBuilder-instances。
  • 您提供的链接不是已经有答案了吗? stackoverflow.com/a/1612835/3956100

标签: c# string


【解决方案1】:

参考源

可以看出

http://referencesource.microsoft.com/#mscorlib/system/string.cs,206408f6325aea24

    [ComVisible(false)]
    public static String Concat(IEnumerable<String> values) {
        if (values == null)
            throw new ArgumentNullException("values");
        Contract.Ensures(Contract.Result<String>() != null);
        Contract.EndContractBlock();

        StringBuilder result = StringBuilderCache.Acquire();
        using(IEnumerator<String> en = values.GetEnumerator()) {
            while (en.MoveNext()) {
                if (en.Current != null) {
                    result.Append(en.Current);
                }
            }            
        }
        return StringBuilderCache.GetStringAndRelease(result);            
    }

String.Concat 使用 StringBuilder 这就是为什么这两种方法大致相同相同

【讨论】:

  • 当对string.Concat() 进行多次单独调用时,这不能解决常见模式,例如当它被循环调用时。在这种情况下,应该使用StringBuilder
【解决方案2】:

string.Concat 使用StringBuilder 来完成它的工作。因此,如果您有一个连接多个字符串的单个操作,我更喜欢string.Concat,因为语法更短。

 var result = string.Concat("abc", "def");

如果您必须执行多个操作,则应使用单个StringBuilder 实例,以提高性能(因为多个string.Concat 调用每次都会实例化它们自己的StringBuilder)。

 var builder = new StringBuilder();
 for (int i = 0; i < numberOfOperations; i++)
 {
      builder.Append(getStringResult());
 }

【讨论】:

  • 我在我的项目中的几个地方使用 string.concat 在我的消息框控件中生成错误消息。错误消息使用不同的值,因此我无法使用通用方法或字符串生成器。我在这里使用 string.concat 是对的吗?
  • @Nisha:如果您需要多个 string.Concat 操作来创建结果字符串,那么 StringBuilder 是首选。如果所有这些都可以在一个将多个字符串连接在一起的操作中完成,那么 string.Concat 更易于阅读。
  • 哦,好的。我现在明白了。谢谢。
【解决方案3】:

另外,如果您有一个已知大小的字符串集合,您可以使用StringBuilder 并将其容量初始化为长度之和 - 这将节省一些时间来增加StringBuilder 的内部缓冲区大小所需的时间。 String.Concat 没有这样做,正如您在 Dmitry 的评论中看到的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多