0

我有这样一段代码,我是如何构建字符串的:

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 += ...

我记得+=使用比StringBuilderas 更多的操作:

  • 从原始字符串制作临时变量(副本)
  • 然后改变 copy 的值
  • 然后用 copy 的值重新定义原始值
4

5 回答 5

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());

你应该进行基准测试。我认为除非循环非常大,否则不会有太大区别。

每当您担心性能时,都应该进行基准测试。可以从优化中获得最大收益的代码并不总是您认为的那样。

于 2013-03-09T01:33:02.113 回答
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多次执行。

于 2013-03-09T01:33:01.197 回答
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作为另一种可能的改进。

于 2013-03-09T01:33:55.560 回答
1

你应该改变你的代码如下:

sb.Append("Session Parameter: [");
sb.Append(item); // ToString is implicit
sb.Append("]<p />Guid Value: [");
sb.Append(Session[item.ToString()]);
sb.Append("]");

否则,字符串生成器就没那么有用了:您所做的只是附加一个值,该值是由编译器为您创建的隐式构造的生成器构造的。

最重要的是移动字符串构建器并将响应写入循环之外。

于 2013-03-09T01:34:01.800 回答
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(']');
}

看看http://www.dotnetperls.com/response-write

于 2013-03-09T02:01:19.753 回答