C#中的StringBulider

C#中的StringBulider

提到StringBuilder,就不得不说.Net中的String类,该类是C#中的基本数据类型,并且是唯一一个引用类型的基本数据类型。但String类的对象是”不可修改的“!这里说的不可修改并非是对象的值不可修改,而是String类中的字符串在声明时就被当成是常量,修改它的值只是另外声明一个常量,并将其指针指向新声明的常量的地址。

关于String类,大家可以看看这里,这篇文章以及评论都很不错:你真的了解.NET中的String吗?
以及对于这篇文章的一个补充,出自另一位大神之手:进一步了解String
不过这篇文章里提到了一些关于IL和反编译的东西,个人看的也是云里雾里。但是最后提到了优化string类存在的问题的几种方法,第一种方法的原理还没弄清楚,第二种是C++中常用的处理方式,第三种就是我们这里提到的StringBuilder。

关于StringBuilder,其实和String类大同小异,看看MSDN中的一段描述吧:

“String 的值一旦创建就不能再修改,所以称它是恒定的。看似能修改 String 的方法实际上只是返回一个包含修改内容的新 String。如果需要修改字符串对象的实际内容,请使用 System.Text.StringBuilder 类。”

看,其实StringBuilder只是对于String类的一个优化(或者补充吧)。
StringBuilder类中常用方法,可以看这里,写的比较详细:C#中StringBuilder的使用
上面这个网站大致介绍了下面几个方法:
EnsureCapacity
Append
AppendFormat
Insert
Remove
Replace
其实这个类的方法也不多,除了上述这些,还剩下构造方法(有4个重载),CopyTo,其他的都是继承自Object类的方法了吧。
哈哈,我还是很懒。但是看到这些博客写的真的挺好,自己就懒得动手写了,当然,看博客时,里面涉及到的代码,能敲的自己多敲敲,多验证下,否则也只是有个大致印象,过后就忘。

不过不得不说下StringBuilder类中的两个成员,capacity和length,前者是类对象声明时系统为其分配的内存空间,默认是16,如果不手动去修改的话。length则表示对象中保存的字符串的长度。
如下代码所示:

StringBuilder s = new StringBuilder("Hello",0,5,20);

上述构造函数的原型为StringBuilder(string value,int index,int length,int capacity);
value就是s的字符串内容,也就是Hello;
index是字符串开始的位置,如果这里不是0而是1,那么s的字符串值应该是ello;
length是字符串的长度,注意,这里的长度是构造函数中字符串value的长度,而非s的长度!如果这里是4而不是5,那么s的字符串值为Hell,如果长度大于value的长度,会报错ArgumentOutOfRangeException,提示”索引和长度必须在字符串内的位置“,也就是说,这个length必须小于等于value的length,而且是index+length <= value.length;
capacity,系统为s分配的内存空间,如果使用默认构造函数的话,s的容量为16。

对于StringBuilder来说,最容易让人混淆的就是容量和长度了。可以这么理解,length是s中字符串值的长度,也就是Hello的长度;而容量则是操作系统为s分配的内存空间,上述例子中,初始化后s得到了20个字节用于存储字符串的空间(注:这20字节的空间只是为了存储s的字符串,不包括它的成员变量比如length和capacity等)。
当我们为s追加字符串而导致s的字符串增长时,可能会出现容量小于长度的情况。这时,操作系统会为s再分配一段当前s容量大小的空间。比如,s的字符串为Hello,length只有5,我们为其分配了10字节的空间用于存储字符串。之后我们在s的后面追加一个字符串“World!”,此时操作系统会为其再分配10字节的空间,那么追加之后,s的容量将变成10+10 = 20。

至于String类与StringBuilder的对比,上面提到的一篇博客《你真的了解.NET中的String吗?》中有很好的举例,证明了频繁对字符串进行拼接的操作,String类的系统消耗要远大于StringBuilder。但其例子中的次数是非常大的一个数字,如果是几十次乃至上百次字符串拼接操作,StringBuilder的效率据说会稍微比String类低点(具体无法验证,在博客《C#中StringBuilder的使用》中的评论里有人提到的)。

StringBuilder的介绍大致就是这样,虽然我的博客写的并不是很长,也几乎没什么代码,究其原因,还是有太多的大神们已经写好了的东西,我们应该学会站在巨人的肩膀上去创造,而不是自己去造轮子。好吧,这个借口有点冠冕堂皇,不管怎么说,日志是要坚持写下去的,代码也是要坚持敲的。只能多动手了!

你可能感兴趣的:(C#/.net,stringbuilder,c#)