文字列の常連が、あなたは彼がラインに不慣れではないかわからないとき、私はその日を満たしているため、文字列のプログラマは、文字列の連結は、いくつかの方法がある何その後、ステッチ、文字列の実際の開発プロセスで実現一般的であり、それは?作品は波を学ぶために、通信するために、話を一緒にしましょう。おそらく、あなたは必ずしも方法、我々はそこに右の最善の方法を使用して、まあ、あまりにも簡単です誰がああ、ハハ、本当に簡単に使用することはないだろうが、ないこと、と言うのだろうか?
概念を理解しなければならない文字列を格納するデータの種類についての記事の前に、我々は簡単にトーク:
文字列は、参照型で密封されたクラスである、ヒープ上に格納され、すべての新しい変更が自動的に回収された原稿を格納するための新しい文字列を作成します。これは、誰もがよく、ハッハッハを知って、気持ちがナンセンスではありません。
次の4つの一般的な方法列のモザイク:C#言語の下には、開発のために説明します
直接縫い合わせてまず、+
直接ステッチまでは、分析にコードのシンプルな作品を以下の、我々のコード+最も一般的な方法です
1 列 STR = " 1 " ; 2 3 STR = STR + " 2 "。
最初のコード、値が「1」であるSTR変数を格納するために割り当てられた最初のメモリ空間
コードの2番目の段落は、「12」を格納するための新しいメモリ空間を再割り当てし、新たなアドレスSTRを指します
分析を通じて、我々は実際には、簡単なコードの両端に、アドレスの文字列連結の数と、操作の倍のメモリ・アドレスがあることを見つけ、割り当てられたメモリアドレスの数も増加されたときにいくつかの簡単な文字列スプライシングを経て、実際には、我々はまだ感じたときに、パフォーマンスに影響を与えないが、文字列の数が多い、あなたが感じているだろうと、そのメモリがないだけ無駄ですが、また直接性能に影響を与えます。
だから、+文字列連結によって、実際の開発プロジェクト、では比較的一般的な、しかし、この方法では、あなただけののこぎりもとてもフレンドリーではなく、非友好的なことから、その後、明らかにここで我々の分析、より友好的な方法の友人があるだろうかのStringBuilderので文字列の連結を実装します。
第二に、文字列を縫い合わせることでのStringBuilder
StringBuilderの事実は、内部メンテナンスに対応する文字列が動的データ自体の長さを増やすことができ、格納された文字列の長さを超える16、デフォルトの長さが自動的に拡張の長さの2倍です。
ハハ、そういえば、あなたは問題を見て、それが自動拡張の長さを超えていると思います、自動拡張は、いくつかの拡張は、あなたはまだ、パフォーマンスに影響を与えていないと感じています、しかし、それはまた、当然のことながら、パフォーマンスを犠牲にする必要はない単語数以上であれば、あなたは、これはまた、いくつかのヒントのStringBuilderで、明らかに感じるでしょう。
私たちは、StringBuilderの時間を初期化し、あなたはその技術のベテランを見つけるだろう、コードの異なるジュニアパートナーに行ってきました細部のギャップに反映されているのStringBuilderの長さを、初期化するために、文字列のサイズの推計によると保存されます。
彼は、それはナンセンスを話していないことを証明するために半日のナンセンスは、実際のコードに来てされていないと述べましたか?そして、不安にならない、前回の記事では、私は、特にテストコードの比較分析を書きます。
それに慣れていない第三に、String.Formatの
いくつかの形式のデータ登録の塗りつぶしで、String.Formatのがしばしば見られ、彼は、大きな利点があるのですが比較的明確に見えます
実際には、我々は根本的な本質はStringBuilderのを達成することであることがわかります根底にある文字列の実現を見てきました
ここでString.Formatのを達成するためのソースコードがあります
パブリック静的文字列形式(するIFormatProviderプロバイダー、文字列形式、paramsはオブジェクト[]引数)<BR> { IF(フォーマット== NULL ||引数== NULL) 新しい例外ArgumentNullException(?(フォーマット== nullの) "形式": "引数")を投げます。 StringBuilderのSB =新しいStringBuilderの(format.Length + args.Length * 8)。 sb.AppendFormat(プロバイダ、フォーマット、引数)。 リターンsb.ToString(); }
実際、String.Formatのは、私たちは、ハッハッハ、疲れを感じることはありません長いったらしい導入では、ので、使用するのは簡単です
文字列の結果= String.Formatの( "こんにちは誰もが、私の名前は{0}、{1}は今年で"、 "達人プログラマーツアー"、1);
第四に、$モードの文字列の連結
C#6.0が、$文字列連結の方法は、実際には、あまりにも多くの文字列の連結は、自分自身をリッピングすると推定されている場合、それは単にString.Formatの流線操作バージョン、String.Formatのある対応関係を伝えることを余儀なくされた場合には、あなたが知っていませんとにかく、なしで生きることを、私は前に遭遇していました。良いの$は次の例が示すには、すべての顔をこの問題を回避します:
文字列名は=「実践的なプログラマーの旅」。 int型の年齢= 1; 文字列str = String.Formatの(、名前、年齢 "私の名前は、私は{1}歳です{0}です"); 文字列str2を= $「私の名前である {名前}、私は{年齢}歳です」;
最終結果は次のとおりです。STR = STR1
第五には、当然のことながら、他の方法ではなく、この長いったらしいで、フォローアップの議論があります
テストの分析
長い時間が、ない何かが、私はあなたがテストコードに直接以下、納得していないことを知っているいくつかの実際のテストを取得するために言いました:
システムを使用しました。 たSystem.Diagnosticsを使用しました。 System.Textのを使用しました。 名前空間stringSplicingTest { /// <要約> ///文字列連結の練習 /// </要約> パブリッククラスプログラム { /// <要約> //メイン関数のエントリー /// </要約> ///ます。<param name = "引数"> </ param>の 静的な無効メイン(文字列[] args) { それぞれのStringBuilder +によってデジタル0及び100に接続された//試験 Console.WriteLineを(「は、それぞれ+とのStringBuilderに接続された試験」)。 Console.WriteLineを( ""); Console.WriteLineを(「接続テスト0から100まで番号」)。 Console.WriteLineを( ""); プラス文字列(100); StringBuilderString2(100)。 Console.WriteLineを( ""); Console.WriteLineを( ""); Console.WriteLineを(「テスト接続0--10000番号」)。 プラス文字列(10000); StringBuilderString2(10000); Console.WriteLineを( ""); Console.WriteLineを( ""); //以下の試験も接続StringBuilderの文字列、指定された長さを食べるために定義されている、比較が指定されていない長さ Console.WriteLineを(@「テスト下のStringBuilderは、同じ列に接続され、それが定義され、指定された長さは、比較の長さを指定されていません」)。 Console.WriteLineを( ""); Console.WriteLineを( "0から接続テスト - 1,000,000")。 Console.WriteLineを(「長さを初期化できません」)。 StringBuilderString(1000000)。 Console.WriteLineを(「長さの初期化」)。 StringBuilderString2(1000000)。 Console.WriteLineを( ""); Console.WriteLineを( ""); Console.WriteLineを( "接続テスト0 - 10,000,000数")。 Console.WriteLineを(「長さを初期化できません」)。 StringBuilderString(10000000)。 Console.WriteLineを(「長さの初期化」)。 StringBuilderString2(10000000)。 Console.ReadLine(); } /// <要約> +によって///文字列連結 /// </要約> ///ます。<param name = "totalNum"> </ param>の プライベートの静的な無効PlusString(int型totalNum) { ////、ストップウォッチを定義し、実行の実行時間を取得します ストップウォッチST =新しいストップウォッチ(); //クラスをインスタンス化 st.Start(); //タイマーを開始 Console.WriteLineを( "接続文字列+で開始しました:"); 文字列の結果=「」; ////アレイを定義します 以下のために(; I <totalNum; int型私は0を= I ++) { 結果=結果+ i.ToString()。 } 時間統計の//必要スニペット st.Stop(); //タイミングを終了 Console.WriteLineを(String.Formatの( "{0}ミリ秒!+の接続文字列、完成した合計時間"、 st.ElapsedMilliseconds.ToString()))。 } /// <要約> Sによって///文字列の連結 /// </要約> ///ます。<param name = "totalNum"> </ param>の プライベートの静的な無効StringBuilderString(int型totalNum) { ////、ストップウォッチを定義し、実行の実行時間を取得します ストップウォッチST =新しいストップウォッチ(); //クラスをインスタンス化 st.Start(); //タイマーを開始 Console.WriteLineを( "接続文字列のStringBuilderを通じて、開始:"); StringBuilderの結果=新しいStringBuilderの(); ////アレイを定義します 以下のために(; I <totalNum; int型私は0を= I ++) { result.Append(i.ToString())。 } ストリング結果2 = result.ToString()。 時間統計の//必要スニペット st.Stop(); //タイミングを終了 Console.WriteLineを(String.Formatの( "!{0}ミリ秒の合計時間のStringBuilderを接続文字列、完成しました"、 st.ElapsedMilliseconds.ToString()))。 } /// <要約> ///長さの初期設定を指定するスプライシングStringBuilderの文字列によって、 /// </要約> ///ます。<param name = "totalNum"> </ param>の プライベートの静的な無効StringBuilderString2(int型totalNum) { ////、ストップウォッチを定義し、実行の実行時間を取得します ストップウォッチST =新しいストップウォッチ(); //クラスをインスタンス化 st.Start(); //タイマーを開始 Console.WriteLineを( "接続文字列のStringBuilderを通じて、開始:"); StringBuilderの結果は=新しいStringBuilderの(totalNum * 6)。 ////アレイを定義します 以下のために(; I <totalNum; int型私は0を= I ++) { result.Append(i.ToString())。 } ストリング結果2 = result.ToString()。 時間統計の//必要スニペット st.Stop(); //タイミングを終了 Console.WriteLineを(String.Formatの( "!{0}ミリ秒の合計時間のStringBuilderを接続文字列、完成しました"、 st.ElapsedMilliseconds.ToString()))。 } } }
結果を分析し、まとめたもの:
2つの点をテストします。
+とOHのStringBuilder文字列連結のパフォーマンスを比較することによって:一つの試験があります
第二の試験は、次のとおり性能比較のStringBuilderは、長さと初期の長さを初期化しません
おそらく、以下の結論を引き出します
図1に示すように、文字列少ないスプライスされる、+と有意なパフォーマンスの差のStringBuilder
2、長い文字列のステッチ、StringBuilderの利点より多くの明白な
図3は、初期の推定長さよりも同じ文字列のStringBuilderスプライシング効率は、指定された長さを初期化するためには効率的ではありません
これを言って、私たちは、すべての使用方法を理解していると信じています。まあ、時間が遅れている、とすぐに睡眠を洗う、明日は仕事に行かなければなりませんか?
終わり
オリジナル住所:https://www.cnblogs.com/xiaoXuZhi/p/XYH_String2.html