我对使用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相关问答推荐

[x.x.x,)在Packages.lock.json依赖项中是什么意思?

从删除项目时重新索引的列表中删除项目的最佳算法是什么?

NET 6:控制器方法不可访问

如何确定计时器是否正在运行?

为什么 Any() 不适用于 c# null 对象

实例化具有运行时确定类型的对象

为什么需要 XmlNamespaceManager?

调用委托与方法的性能

Await 运算符只能在 Async 方法中使用

有没有办法只在 C# 中设置一次属性

C#中的引用类型

析构函数、dispose 和 finalize 方法的区别

将字典值转换为数组

通过反射查找可空属性的类型

Guid.Parse() 或 new Guid() - 有什么区别?

Windows 服务在哪个目录中运行?

实体框架太慢了.我有哪些 Select ?

序列化一个可为空的 int

检测到包降级警告(dotnet core,vs 2017)

MultipleActiveResultSets=True 还是多个连接?