C# StringWriter
最后修改于 2025 年 4 月 20 日
本教程解释了如何在 C# 中使用 StringWriter 类来高效地写入和操作字符串。StringWriter 提供了将文本写入 StringBuilder 的方法。
StringWriter 类将文本写入 StringBuilder 对象。它继承自 TextWriter 并提供字符串特定的功能。
StringWriter
适用于从多个片段构建字符串,或者当您需要具有字符串的 TextWriter 功能时。它处理各种数据类型并支持格式化。
StringWriter 基本示例
此示例演示了 StringWriter 的基本用法,通过多次写入来创建字符串。我们将构建一个简单的文本消息。
using System; using System.IO; using System.Text; class Program { static void Main() { using (StringWriter writer = new StringWriter()) { writer.Write("Hello, "); writer.WriteLine("world!"); writer.Write("Current date: "); writer.WriteLine(DateTime.Now.ToString("d")); string result = writer.ToString(); Console.WriteLine(result); } } }
该程序创建一个 StringWriter 并写入几个文本片段。Write
和 WriteLine
方法的工作方式与 Console 类似。该示例演示了 StringWriter 如何在内存中累积文本。
ToString
方法检索完整的字符串。using 语句确保正确释放资源。StringWriter 在内部使用 StringBuilder 进行高效的字符串连接。
使用 StringWriter 进行格式化
StringWriter 支持像 Console 和其他 TextWriter 实现一样的复合格式化。此示例显示格式化的输出。
using System; using System.IO; class Program { static void Main() { using (StringWriter writer = new StringWriter()) { string name = "John"; int age = 35; double score = 92.5; writer.WriteLine("Name: {0}, Age: {1}", name, age); writer.WriteLine("Score: {0:F2}%", score); writer.WriteLine("Today: {0:D}", DateTime.Now); Console.WriteLine(writer.ToString()); } } }
该示例演示了 StringWriter 的各种格式化选项。支持数值、日期和自定义格式。占位符 {0}、{1} 等将被格式化值替换。
像 "F2"(2 位小数)和 "D"(长日期)这样的格式字符串与 Console.WriteLine 的工作方式相同。StringWriter 在所有 TextWriter 实现中提供一致的格式化行为。
StringWriter 与 StringBuilder
可以使用特定的 StringBuilder 初始化 StringWriter。此示例显示如何将 StringBuilder 重用于多个 writer。
using System; using System.IO; using System.Text; class Program { static void Main() { StringBuilder sb = new StringBuilder(); using (StringWriter writer1 = new StringWriter(sb)) { writer1.WriteLine("First section:"); writer1.WriteLine("-------------"); writer1.WriteLine("Item 1"); writer1.WriteLine("Item 2"); } using (StringWriter writer2 = new StringWriter(sb)) { writer2.WriteLine(); writer2.WriteLine("Second section:"); writer2.WriteLine("--------------"); writer2.WriteLine("Item A"); writer2.WriteLine("Item B"); } Console.WriteLine(sb.ToString()); } }
同一个 StringBuilder 被用于两个不同的 StringWriter 实例。每个 writer 将内容追加到共享的 StringBuilder。这种方法允许在多个阶段构建复杂的字符串。
StringBuilder 在 writer 的使用之间维护所有内容。这在生成具有单独部分的报告或文档时非常有用。StringWriter 为 StringBuilder 操作提供 TextWriter 接口。
特定于区域性的格式化
StringWriter 可以使用特定的区域性设置进行格式化。此示例演示了文化相关的数字和日期格式化。
using System; using System.Globalization; using System.IO; class Program { static void Main() { var usCulture = new CultureInfo("en-US"); var frCulture = new CultureInfo("fr-FR"); double amount = 1234.56; DateTime date = new DateTime(2023, 12, 31); using (StringWriter writer = new StringWriter()) { writer.WriteLine("US format:"); writer.WriteLine(amount.ToString("C", usCulture)); writer.WriteLine(date.ToString("D", usCulture)); writer.WriteLine(); writer.WriteLine("French format:"); writer.WriteLine(amount.ToString("C", frCulture)); writer.WriteLine(date.ToString("D", frCulture)); Console.WriteLine(writer.ToString()); } } }
该示例显示了为美国和法国文化格式化的相同数字和日期值。货币符号、小数分隔符和日期格式因文化而异。
StringWriter 默认继承当前区域性,但可以使用任何指定的区域性进行格式化。这对于需要特定于区域设置的输出的国际化应用程序非常重要。
使用 StringWriter 写入 XML
StringWriter 通常与 XML writer 一起用于生成 XML 字符串。此示例在内存中创建一个简单的 XML 文档。
using System; using System.IO; using System.Xml; class Program { static void Main() { using (StringWriter writer = new StringWriter()) using (XmlTextWriter xmlWriter = new XmlTextWriter(writer)) { xmlWriter.Formatting = Formatting.Indented; xmlWriter.WriteStartDocument(); xmlWriter.WriteStartElement("Products"); xmlWriter.WriteStartElement("Product"); xmlWriter.WriteAttributeString("ID", "101"); xmlWriter.WriteElementString("Name", "Laptop"); xmlWriter.WriteElementString("Price", "999.99"); xmlWriter.WriteEndElement(); xmlWriter.WriteStartElement("Product"); xmlWriter.WriteAttributeString("ID", "102"); xmlWriter.WriteElementString("Name", "Mouse"); xmlWriter.WriteElementString("Price", "19.99"); xmlWriter.WriteEndElement(); xmlWriter.WriteEndElement(); xmlWriter.WriteEndDocument(); Console.WriteLine(writer.ToString()); } } }
该示例使用 XmlTextWriter 与 StringWriter 一起生成格式化的 XML。所有 XML 输出都进入 StringWriter 的内部缓冲区。
当您需要将结果作为字符串而不是文件时,StringWriter 非常适合 XML 生成。缩进格式使 XML 易于阅读。这种方法在 Web 服务和 API 中很常见。
将 StringWriter 与 StringReader 组合
此示例显示了如何将 StringWriter 与 StringReader 一起用于字符串处理。我们将写入数据,然后将其读回。
using System; using System.IO; class Program { static void Main() { string csvData; // Write CSV data using (StringWriter writer = new StringWriter()) { writer.WriteLine("Name,Age,Occupation"); writer.WriteLine("John Smith,35,Engineer"); writer.WriteLine("Jane Doe,28,Designer"); writer.WriteLine("Bob Johnson,42,Manager"); csvData = writer.ToString(); } // Read CSV data Console.WriteLine("CSV Content:"); using (StringReader reader = new StringReader(csvData)) { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } } }
该程序首先将 CSV 格式的数据写入 StringWriter。然后使用 StringReader 逐行读取生成的字符串。
这演示了 StringWriter 和 StringReader 如何协同工作以进行内存中的字符串处理。该方法对于临时数据格式化和解析而无需文件 I/O 开销非常有用。
具有重写的自定义 StringWriter
您可以通过重写方法来创建自定义 StringWriter 类。此示例显示了一个转换输出的自定义 writer。
using System; using System.IO; using System.Text; class UppercaseStringWriter : StringWriter { public override void Write(char value) { base.Write(char.ToUpper(value)); } public override void Write(string value) { if (value != null) { base.Write(value.ToUpper()); } } public override void WriteLine(string value) { if (value != null) { base.WriteLine(value.ToUpper()); } else { base.WriteLine(); } } } class Program { static void Main() { using (UppercaseStringWriter writer = new UppercaseStringWriter()) { writer.WriteLine("this will be uppercase"); writer.Write("mixed CASE "); writer.Write("text"); writer.WriteLine(); writer.Write('a'); writer.Write('b'); writer.Write('c'); Console.WriteLine(writer.ToString()); } } }
UppercaseStringWriter 类继承自 StringWriter 并重写关键方法以将输出转换为大写。所有写入都通过自定义转换。
这种技术允许为特定需求(如大小写转换、编码或日志记录)创建专门的字符串 writer。该示例显示了如何为不同的数据类型重写单个写入方法。
来源
本教程介绍了使用 StringWriter 在 C# 中编写和操作字符串,包括格式化、XML 生成和自定义实现。
作者
列出所有 C# 教程。