为什么 .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,这里特别指出了这种差异。
我希望下面的代码(来自 .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,这里特别指出了这种差异。