为什么 .Net 中异常 class 的 ToString() 方法不使用 StringBuilder 来构建字符串?

Why does ToString() method of Exception class in .Net not use a StringBuilder to build the string?

我希望下面的代码(来自 .Net 框架中的异常 class)使用 StringBuilder 构建字符串,然后 return 使用 builder.ToString() 而不是在现有字符串上使用“+”运算符,最终每次都会创建一个新字符串。

我希望编写 .Net 源代码的人们尽可能遵循最佳实践,因此我想仔细检查这是否仍然是最佳的

private String ToString(bool needFileLineInfo, bool needMessage) {
    String message = (needMessage ? Message : null);
    String s;
    if (message == null || message.Length <= 0) {
        s = GetClassName();
    }
    else {
        s = GetClassName() + ": " + message;
    }

    if (_innerException!=null) {
        s = s + " ---> " + _innerException.ToString(needFileLineInfo, needMessage) 
              + Environment.NewLine 
              + "   "
              + Environment.GetResourceString("Exception_EndOfInnerExceptionStack");

    }

    string stackTrace = GetStackTrace(needFileLineInfo);
    if (stackTrace != null)
    {
        s += Environment.NewLine + stackTrace;
    }

    return s;
}

如果不询问代码作者,就无法确定代码作者为何选择此实现。

也就是说,值得牢记的是,优先选择 StringBuilder 而不是简单 string 串联的一般指导主要适用于具有任意大迭代次数的循环场景。

在上面的示例中,该方法的主要部分最终应该调用 Concat() 方法,该方法从输入创建一个新的 string 对象比追加更好每个部分迭代使用 StringBuilder。为其他串联引入 StringBuilder,尤其是当它们并不总是会发生时(因为它们是有条件的),在常见情况下很可能不是最佳选择。

参见例如String concatenation vs String Builder. Performance,这里特别指出了这种差异。