我对使用StringBuilder类有点困惑,首先:

string对象串联操作总是从现有string对象和新数据创建一个新对象.StringBuilder对象维护一个缓冲区,以容纳新数据的串联.如果有可用空间,新数据将附加到缓冲区的末尾;否则,将分配一个新的、更大的缓冲区,将原始缓冲区中的数据复制到新缓冲区,然后将新数据附加到新缓冲区.

但是创建StringBuilder个实例以避免创建String个新实例的意义在哪里呢?这听起来像是"一换一"的交易.

static void Main(string[] args)
{
    String foo = "123";
    using (StringBuilder sb = new StringBuilder(foo)) // also sb isn't disposable, so there will be error
    {
        sb.Append("456");
        foo = sb.ToString();
    }

    Console.WriteLine(foo);
    Console.ReadKey();
}

为什么我不应该直接用

+=

Edit:好的,我现在知道如何重用StringBuilder的一个实例(仍然不知道这是否适用于代码标准),但这不值得仅用于一个string,不是吗?

推荐答案

必须通过复制 struct 来修改100个 struct (如strings),这样会消耗更多内存并降低应用程序的运行时间(还会增加GC个时间,等等).

StringBuilder通过使用相同的可变对象进行操作来解决这个问题.

However:

在编译时串联string时,如下所示:

string myString = "123";
myString += "234";
myString += "345";

它实际上会编译成这样:

string myString = string.Concat("123", "234", "345");

此函数比使用StringBuilder更快,因为进入该函数的string的数量是已知的.

因此,对于编译时已知的string个连接,您应该首选string.Concat().

对于未知数量的string,如以下情况:

string myString = "123";
if (Console.ReadLine() == "a")
{
    myString += "234";
}
myString += "345";

现在编译器不能使用string.Concat()函数,但是,只有当连接6-7或更多的strings时,StringBuilder才显得更有效.

不良做法用法:

StringBuilder myString = new StringBuilder("123");
myString.Append("234");
myString.Append("345");

精细实践用法(注意使用if):

StringBuilder myString = new StringBuilder("123");
if (Console.ReadLine() == "a")
{
    myString.Append("234");
}
myString.Append("345");

最佳实践用法(注意使用while循环):

StringBuilder myString = new StringBuilder("123");
while (Console.ReadLine() == "a")
{
    myString.Append("234"); //Average loop times 4~ or more
}
myString.Append("345");

.net相关问答推荐

为什么.Net 8.0.100是预览版?

如何在AutoMapper中添加自定义方法到项目中?

带有ASP.NET核心的Angular 项目模板.API试验

使用CLR将数据从Excel导入SQL Server时出错

如何将 signalR 添加到不同项目中的后台服务?

保存时不保留 XML 格式

.net Maui 在单击按钮时访问 CollectionView 中的数据项

IANA 到 Windows 时区映射

如何在 NET 5 / 6 中使用 Direct3D11CaptureFramePool

C#.Net 中的可选返回

我什么时候应该在 C# 中使用使用块?

获取 .NET 程序集的 AssemblyInformationalVersion 值?

您可以使用 Xamarin 开发 Linux 应用程序吗?

说明 C# 中 volatile 关键字的用法

绑定在代码隐藏中定义的对象

记录器包装器最佳实践

作者主签名的时间戳发现了一个建链问题:UntrustedRoot: self-signed certificate in certificate chain

如何卸载Microsoft .NET Core 1.0.0 RC2 - VS 2015 Tooling Preview 1?

为 webClient.DownloadFile() 设置超时

在 WPF 中设置 Tab 键顺序