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

私が覚えているように+=、より多くの操作を使用しますStringBuilder

  • 元の文字列から一時変数(コピー)を作成する
  • 次に、コピーの値を変更します
  • 次に、元の値をコピーの値で再定義します
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());

必要なのは1つだけ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.Writeforeach

于 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 に答える