Keep on going never give up.

Let's Go

C# 学习笔记(32)StringBuilder类

C#Lonely2019-05-14 17:32:4229次0条

我们都知道string类型具有不可变性,对字符串进行操作的方法实际上返回的是新的字符串对象。 每次使用 System.String 类中的方法之一,都要在内存中创建一个新的字符串对象,这就需要为新对象开辟一块内存空间。 当我们在程序当中需要进行大量重复修改字符串的情况下,每次都新建 String 对象关联的开销可能会非常大。为了避免产生大量的垃圾,在我们需要修改字符串(而不创建新对象)的时候,可以使用 System.Text.StringBuilder 类。 例如,如果在循环中将许多字符串连接在一起,使用 StringBuilder 类可以提升性能。

StringBuilder与string的效率对比

代码示例:

string str = string.Empty;
Stopwatch sw = new Stopwatch(); //创建一个计时器,用来记录程序运行的时间。
sw.Start(); //开始计时
for (int i = 0; i < 100000; i++)
{
    str += i.ToString();
}
sw.Stop(); //结束计时
Console.WriteLine(sw.Elapsed); //输出计时时间
Console.ReadKey();
//该程序在我的电脑上运行总耗时 00:00:21.0492830 秒
StringBuilder sb = new StringBuilder();
Stopwatch sw = new Stopwatch(); //创建一个计时器,用来记录程序运行的时间。
sw.Start(); //开始计时
for (int i = 0; i < 100000; i++)
{
    sb.Append(i.ToString());
}
sw.Stop(); //结束计时
Console.WriteLine(sw.Elapsed); //输出计时时间
Console.ReadKey();
//该程序在我的电脑上运行总耗时 00:00:00.0177520 秒

由上运行结果可见,StringBuilder效率要比string高,在对字符串进行频繁修改的情况下,如在For循环中进行操作等,那么将会频繁的创建新的字符串对象,造成系统的不必要开销,所以这种情况下推荐大家都使用StringBuilder类来对字符串进行操作。


StringBuilder的使用方法

实例化StringBuilder对象

通过使用重载的构造函数方法之一初始化变量,可以创建 StringBuilder 类的实例,如下面的示例所示。

StringBuilder sb = new StringBuilder("Hello World!");

设置容量和长度

虽然 StringBuilder 是动态对象,支持扩展它封装的字符串中的字符数,但可以指定值,作为对象可保留的字符数上限。 此值称为“对象容量”,不得将它与当前 StringBuilder 保留的字符串长度相混淆。 StringBuilder类,默认的容量大小是16,意思就是说我们如果不指定StringBuilder容量,超过16个长度,就会重新去分配一次内存。例如,可以使用长度为 5 的字符串“Hello”创建 StringBuilder 类的实例,同时可以指定此对象的最大容量为 25。 修改 StringBuilder 时,除非达到容量,否则对象不会为自己重新分配空间。 当达到容量时,将自动分配新的空间且容量翻倍。 可以使用重载的构造函数之一,指定 StringBuilder 类的容量。 下面的示例指定可以将 myStringBuilder 对象增加到最多 25 个空间。

StringBuilder myStringBuilder = new StringBuilder("Hello World!", 25);

另外,还可以使用读/写 Capacity 属性,设置对象的长度上限。 下面的示例使用 Capacity 属性来定义对象的最大长度。

myStringBuilder.Capacity = 25;

EnsureCapacity 方法可用于检查当前 StringBuilder 的容量。 如果容量大于传递的值,则不进行任何更改;但是,如果容量小于传递的值,则会更改当前的容量以使其与传递的值匹配。也可以查看或设置 Length 属性。 如果将 Length 属性设置为大于 Capacity 属性的值,则自动将 Capacity 属性更改为与 Length 属性相同的值。 如果将 Length 属性设置为小于当前 StringBuilder 对象内的字符串长度的值,则会缩短该字符串。


Append方法:将信息追加到当前 StringBuilder 的末尾。

StringBuilder sb = new StringBuilder("Hello,World!");
//追加对应的字符串
Console.WriteLine(sb.Append("哈哈哈")); //输出 Hello,World!哈哈哈

Insert方法:将字符串或对象插入到当前 StringBuilder 的指定索引中。

StringBuilder sb = new StringBuilder("0123456");
//在对应位置插入指定的字符串
Console.WriteLine(sb.Insert(3, "哈哈")); //输出 012哈哈3456

Remove方法:从当前 StringBuilder 中删除指定数量的字符。

StringBuilder sb = new StringBuilder("0123456");
//移除从索引开始位置的N个字符
Console.WriteLine(sb.Remove(3, 2)); //输出 01256

Replace方法:替换指定索引处的指定字符。

StringBuilder sb = new StringBuilder("我真帅");
//替换
Console.WriteLine(sb.Replace("真", "非常")); //输出 我非常帅

AppendFormat方法:用带格式文本替换字符串中传递的格式说明符。

StringBuilder sb = new StringBuilder("我的工资为:");
//按照指定的格式来添加对应的字符串
int num = 1024;
Console.WriteLine(sb.AppendFormat("{0:C}元", num)); //输出 我的工资为:¥1,024.00元

AppendLine方法:将默认的行终止符追加到当前 StringBuilder 对象的末尾。

StringBuilder sb = new StringBuilder("嘤嘤嘤");
//将默认的行终止符追加到当前 StringBuilder 对象的末尾。
Console.Write(sb.AppendLine("我居然被换行了"));
Console.Write("哦豁");
//输出结果:
//嘤嘤嘤我居然被换行了
//哦豁

将 StringBuilder 对象转换为字符串

必须先将 StringBuilder 对象转换为 String 对象,然后才能将 StringBuilder 对象表示的字符串传递给包含 String 参数的方法,或在用户界面中显示它。 可通过调用 StringBuilder.ToString 方法来执行此转换。 

StringBuilder sb = new StringBuilder("你的代码写的真像蔡徐坤!");
string str = sb.ToString();
Console.WriteLine(str); //输出 你的代码写的真像蔡徐坤!
Console.WriteLine(sb.ToString()); //输出 你的代码写的真像蔡徐坤!
Console.ReadKey();




暗锚,解决锚点偏移

文章评论

    嘿,来试试登录吧!