ZetCode

C# StringWriter

最后修改于 2025 年 4 月 20 日

本教程解释了如何在 C# 中使用 StringWriter 类来高效地写入和操作字符串。StringWriter 提供了将文本写入 StringBuilder 的方法。

StringWriter 类将文本写入 StringBuilder 对象。它继承自 TextWriter 并提供字符串特定的功能。

StringWriter 适用于从多个片段构建字符串,或者当您需要具有字符串的 TextWriter 功能时。它处理各种数据类型并支持格式化。

StringWriter 基本示例

此示例演示了 StringWriter 的基本用法,通过多次写入来创建字符串。我们将构建一个简单的文本消息。

Program.cs
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 并写入几个文本片段。WriteWriteLine 方法的工作方式与 Console 类似。该示例演示了 StringWriter 如何在内存中累积文本。

ToString 方法检索完整的字符串。using 语句确保正确释放资源。StringWriter 在内部使用 StringBuilder 进行高效的字符串连接。

使用 StringWriter 进行格式化

StringWriter 支持像 Console 和其他 TextWriter 实现一样的复合格式化。此示例显示格式化的输出。

Program.cs
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。

Program.cs
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 可以使用特定的区域性设置进行格式化。此示例演示了文化相关的数字和日期格式化。

Program.cs
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 文档。

Program.cs
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 一起用于字符串处理。我们将写入数据,然后将其读回。

Program.cs
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。

Program.cs
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 类文档

本教程介绍了使用 StringWriter 在 C# 中编写和操作字符串,包括格式化、XML 生成和自定义实现。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程