我有这样的代码如何构建字符串:
foreach (var item in Session)
{
StringBuilder sb = new StringBuilder();
sb.Append("Session Parameter: [" + item.ToString() + "]<p />Guid Value: [" + Session[item.ToString()] + "]");
Response.Write(sb.ToString());
}
我想知道,这样的方式是否正确?我的意思是,StringBuilder
这是一个非常有用的东西吗?
如果没有StringBuilder
,这段代码会更快吗?
如果它是使用其他运算符构建的Label1.Text += ...
我记得+=
使用的操作多于StringBuilder
:
答案 0 :(得分:3)
为什么不创建一次StringBuilder
并使用一个Response.Write
?:
StringBuilder sb = new StringBuilder();
foreach (string item in Session)
{
sb.Append("Session Parameter: [");
sb.Append(item.ToString());
sb.Append("]<p />Guid Value: [");
sb.Append(((string)Session[item]));
sb.Append(']');
}
Response.Write(sb.ToString());
你应该做基准测试。除非循环非常大,否则我认为不会有太大差异。
每当您担心性能时,都应该进行基准测试。可以从优化中获得最大收益的代码并不总是您认为的那样。
答案 1 :(得分:2)
你可能想要重构你的代码:
StringBuilder sb = new StringBuilder();
foreach (var item in Session)
{
sb.Append("Session Parameter: [");
sb.Append(item.ToString());
sb.Append("]<p />Guid Value: [");
sb.Append(Session[item.ToString()]);
sb.Append("]");
}
Response.Write(sb.ToString());
您只需要一个StringBuilder
和一个Response.Write
。将它们置于循环中会使您使用StringBuilder
获得的任何优化失败,并且没有理由不止一次Response.Write
。
答案 2 :(得分:1)
您仍未获得StringBuilder
的好处,因为您仍在使用+
连接字符串。针对StringBuilder
优化的版本为:
foreach (var item in Session)
{
StringBuilder sb = new StringBuilder();
sb.Append("Session Parameter: [");
sb.Append(item.ToString());
sb.Append("]<p />Guid Value: [");
sb.Append(Session[item.ToString()]);
sb.Append("]");
Response.Write(sb.ToString());
}
注意:您也可以移动StringBuilder
初始化,并在Response.Write
之外调用foreach
作为另一种可能的改进。
答案 3 :(得分:1)
您应该按如下方式更改您的代码:
sb.Append("Session Parameter: [");
sb.Append(item); // ToString is implicit
sb.Append("]<p />Guid Value: [");
sb.Append(Session[item.ToString()]);
sb.Append("]");
否则,字符串构建器没那么有用:您所做的就是附加一个值,该值是由编译器为您创建的隐式构造的构建器构建的。
最重要的是移动字符串构建器并将响应写在循环之外。
答案 4 :(得分:0)
Response.Write对于此任务来说已经足够了。字符串构建器使它变慢。
foreach (var item in Session)
{
Response.Write("Session Parameter: [");
Response.Write(item.ToString());
Response.Write("]<p />Guid Value: [");
Response.Write(Session[item.ToString()]);
Response.Write(']');
}