文字列連結、安全でないクライアントまで、フルのC#を利用する必要がStringBuilder?

StackOverflow https://stackoverflow.com/questions/779051

質問

私の質問は、この: は文字列を連結したクライアントまで、フルのC#安全ですか?場合は文字列の連結に繋がる想定外のエラー、および置き換える文字列の連結によStringBuilderの原因その誤差がなくなり、どのようになることを示す?

背景: 私は開発途上の小さなコマンドラインにC#アプリ。このコマンドライン引数は、少し複雑なSQLクエリー、および出力の約1300列のデータ形式のXMLファイルです。

最初にプログラムは常に走り微細なデバッグモードになります。しかし、リモードで取得するに750th SQL結果、金型のエラーとなります。エラーがある列のデータが読み込まれるものRead()メソッドのSqlDataReaderオブジェクトが返されます。

この問題を修正によStringBuilderすべてのオペレーションに関するコードは、以前にもあった"文字列1+文字列2".伝える事が出来るって文字列の連結のSQLクエリループは、StringBuilderた既に使用されています。いの簡単なconcatenations間は短い文字列変数の前にコードです。

そして、去年に続き今年も、C#としたスマート取り扱うのに十分なメモリ管理のための追加の文字列です。私が悪いのでしょうか。又はこの表のようなコードの問題なのか。

役に立ちましたか?

解決

ほかにも何をやっているありとXML Apiの代わりに文字列またはStringBuilderるエラーで見たものをそのままにより文字列を連結した.ものへの切り替えStringBuilderでマスクを誤った上で優雅にない文字列を使ったのが原因です。

他のヒント

にお答え: 文字列contatenationクライアントまで、フルのC#や.当期純一般) "安全"なんでタイトループについて説明していただけまでの高さに厳しいメモリの圧力に負担をかけごみがございます。

私は危険かを当てるというものは誤りだった資源の枯渇かが、さすが一流のホテルをご提供いただければ詳しくは、例えば、皆さんを受ける例外?の応用が異常終了?

背景: .純文字列は不変なのに、なんとなくい連結したこのように:

var stringList = new List<string> {"aaa", "bbb", "ccc", "ddd", //... };
string result = String.Empty;
foreach (var s in stringList)
{
    result = result + s;
}

これは、ほぼ同等の

string result = "";
result = "aaa"
string temp1 = result + "bbb";
result = temp1;
string temp2 = temp1 + "ccc";
result = temp2;
string temp3 = temp2 + "ddd";
result = temp3;
// ...
result = tempN + x;

この例では強調している各時間のループの成果を配分した仮の文字列になります。

以降の文字列は不変なので、実行時には代替オプションが割り当てを新しい文字列の各時間を追加したり他の文字列の結果です。

その result 文字列は常に更新されるポイントは、最先端の中間結果、数多く生産しながら仮名文字列の対象となるガベージコレクションのほとんど。

本連結して以下の文字列をメモリに記憶が前提とはなりますが、簡単のためのガベージコレクタがまだある。

string a = "aaa";
string b = "bbb";
string c = "ccc";
// ...
string temp1 = "aaabbb";
string temp2 = "aaabbbccc";
string temp3 = "aaabbbcccddd";
string temp4 = "aaabbbcccdddeee";
string temp5 = "aaabbbcccdddeeefff";
string temp6 = "aaabbbcccdddeeefffggg";
// ...

これらの暗黙の一時的な変数はガベージコレクションの対象そのものがまだ割り当てられてしまいます。時の連なりにループを出していただきありがとうござい歪みのガベージコレクタは、何といっても、コード実行の非常に遅くなります。っているが、その間、パフォーマンスへの影響、このことが飛躍的として連結した文字列になりが大きくなります。

お勧めのアプローチを常時使用 StringBuilder 行っているのだとか以上の数の文字列concatenations. StringBuilder 使用変更可能なバッファへの割当てに必要となるビルアップ文字列になります。

文字列の連結が安全に行ないましたが、そのメモリの集中によ用StringBuilderがcontatenating多数の文字列にします。および極端な場合にしてしまう可能性もあります。ラのメモリを消費します。

そのほとんど確かにバグだ。

かんcontatenating非常に大きな数の文字列です。やかもしれないよう全く異なります。

詳細をデバッグな観念の根本原因だ問題を低減しようとして最低限必要なリプロの問題は、ポストのコードです。

どのくらいで、連結したバージョンの文字列ビルダのバージョンになっていますか?できることへの接続DBは閉じられます。だたくさんの連結に同行し、w/StringBuilderそのままにビットより効率的です。

させる一因となる文字列は変更できます。当期純な場合の効果に変わりはありませんの運転では、このようなと連結して実際に新しい文字列になります。

もうひとつの原因は文字列の長さをintで最大限の長さをInt32.MaxValueは2,147,483,647.

いずれの場合、StringBuilderが良い"文字列1+文字列2"のためにこのよう動作します。がされている"XML機能があります。

string.Concat(string[]) がインターネットには想像もつかな連結を文字列です。でlitterly殺 StringBuilder 用いられた場合にはループまで楽しめる、充実した情報が作成 StringBuilder 各なります。負荷があ参照の場合はGoogle"c#の文字列形式vs stringbuilder"があります。http://www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx を与えまideerいます。この文字列になります。参加賞を連結した試験も知識を深こ string.Concat(string, string) が使用されているの過負荷するバージョンが配列になります。た場合のMSILコードにより発生するの異なる方法でいいの下にフードです。

ここが私のショットをカバーした参考書シリーズ。

文字列です。当期純なstringbuilders)の文字列インターンプールがあります。これは基本的に地域のCLR共有の文字列性能の向上を図ります。ここではその一部に限定ここでは、がんを制限です。私は想像の連なりを確認することができま打撃を受けて、天井の文字列インターンプールがあります。なSQLはそのきっかけをつくっていきたい値までなかでもどこでもできます。

迅速、簡単に試験する nGen お客様組立とを確認してくださいまだにエラーとなります。後nGen'ing、適な利用のプールがあります。

これが失敗した場合は、ご連絡Microsoftしていか。と思う私の音果がわからないのはなぜでデバッグモードになります。もしかすると、デバッグモードを文字列にな味.いません。

場合の文字列といStringBuilder.この設計で、より効率的な利用"文字列1+文字列2".

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top