35

私は最近それを読み、からの書き込みと読み取りに使用されStringWriterます。StringReaderStringBuilder

Objectを使用するStringBuilderと、それは自給自足のクラスのように見えます。

、、、などをStringBuilder使用して、を StringBuilder.Append()読み書きするあらゆる方法があります。Insert()Replace()Remove()

  1. 単独では実行できないStringWriterとの可能な使用法は何ですか?StringReaderStringBuilder
  2. それらの実用的な使い方は何ですか?
  3. Streamそれらが入力として使用されていない(他のライターとリーダーが操作するコンストラクターパラメーターとしてストリームを使用しているため)考えられる理由は何StringBuilderでしょうか?
4

4 に答える 4

37

StringBuilder 自体では実行できない StringWriter と StringReader の可能な使用法は何ですか?

StringReaderおよびStringWriterからそれぞれ派生しTextReaderますTextWriter。したがって、それらができることはTextReaderまたはTextWriterインスタンスとして機能しますが、これらのタイプのいずれも派生していないため、どちらかstringまたはできません。StringBuilder

それらの実際の使用は何ですか?

これらを使用すると、 orが必要な場合に、 TextReaderorを期待する API を呼び出すことができます。TextWriterstringStringBuilder

Stream を入力として使用していない理由として考えられるのは (他のライターとリーダーが操作するコンストラクター パラメーターとしてストリームを使用しているため)、StringBuilder でしょうか?

ストリームでは機能しないためです。彼らはstrings またはStringBuilders で動作します。これらは、異なるインターフェイスを期待する API にこれらの型を適応させる単純なラッパー クラスです。参照:アダプタ パターン

于 2010-08-03T00:38:10.763 に答える
7

他の人はすでに言っていますが、それは TextReader/TextWriter から派生し、代わりに使用できるためです。1 つには、コンテンツを文字列としてのみ必要な場合は、ファイルに使用するのと同じ方法で行を出力する方が理にかなっています。メモリ内の複数の行にまたがる出力が必要な場合、StringBuilder を使用してすべての行の末尾に "\r\n" を忘れずに配置する必要があるのはなぜでしょうか? 改行に "\n" のみを使用するシステムでコードを実行したり、データをフォーマットしたりするにはどうすればよいでしょうか?

StringBuilder sb = new StringBuilder();
// will be invalid on systems that only use \n
sb.AppendFormat("{0:yyyy-MM-dd HH:mm:ss} - Start\r\n", DateTime.Now);
// still have to add an extra parameter
sb.AppendFormat("The current time is {0:yyyy-MM-dd HH:mm:ss}{1}", DateTime.Now,
    Environment.NewLine);

StringWriter sw = new StringWriter();
// Don't have to worry about it, method name tells you there's a line break
sw.WriteLine("{0:yyyy-MM-dd HH:mm:ss} - Start", DateTime.Now);
// no extra parameters
sw.WriteLine("The current time is {0:yyyy-MM-dd HH:mm:ss}", DateTime.Now);

ファイルを 1 行ずつ処理したい場合、ファイル全体を StringBuilder にロードして改行文字で配列に分割する代わりに、おそらく StreamReader を使用するでしょう。StringReader を使用すると、TextBox または Web フォームの文字列から StringReader を作成することにより、まったく同じ方法を使用できます (汎用の TextReader を使用する場合)。

Linq2Sql DataContexts には、TextWriter に設定できる Log プロパティがあり、実行前にクエリを出力して、何が実行されているかを正確に確認できます。これをファイルに添付された TextWriter に設定できますが、テスト時に StringWriter を添付して Web ページの下部にコンテンツを出力することもできます...

于 2010-11-30T04:47:36.990 に答える
0

その目的が StringBuilder で使用するためであると誰が言ったのかはわかりませんが、それはまったく間違っています。ご指摘のとおり、StringBuilder は別のクラスを使用せずに読み書きできます。StringWriter および StringReader クラスは、TextReader および TextWriter .Net Framework 基本クラスを拡張し、テキスト データを操作するためのストリームのような機能を提供します。たとえば、いくつかの XmlDocument タイプのクラスを操作する必要がある場合、一部のメソッドでは TextReader を介して Xml データをロードできるため、Xml テキストを文字列変数として持っている場合は、それを StringReader にロードできます。次に、それを XmlDocument に提供します。

于 2010-08-03T00:35:38.767 に答える