技术开发 频道

深入理解String 高效使用精妙设计

  四、 从Garbage Collection的角度来看string

  我们知道在一个托管的环境下,一个对象的生命周期被GC管理和控制。一个对象只有在他不被引用的时候,GC才会对他进行垃圾回收。而对于一个string来说,它始终被interning table引用,而这个interning table是针对一个Process的,是被该Process所有AppDomain共享的,所以一个string的生命周期相对比较长,只有所有的AppDomain都不具有对该string的引用时,他才有可能被垃圾回收。

  五、 从多线程的角度来看string

  一方面由于string的恒定性,我们不用考虑多线程的并发操作产生的线程同步问题。另一方面由于字符串的驻留,我们在对一个string对象进行加锁操作的时候,极有可能拖慢这个Application的performance,就像我们的Sample中演示的那样。而且很有可能影响到处于同一进程的其他Application,以致造成死锁。所以我们在使用锁的时候,除非万不得已,切忌对一个string进行加锁。

  六、 如何高效地使用string

  下面简单介绍一些高效地使用string的一些小的建议:

  1. 尽量使用字符串(literal string)相加来代替字符串变量和字符创相加,因为这样可以使用现有的string操作指令进行操作和利用字符串驻留。

  比如:

string s = "abc" + "def";

 

  优于

string s = "abc";
s
= s + "def";

 

  2. 在需要的时候使用StringBuilder对string作频繁的操作:

  由于string的恒定性,在我们对一个string进行某些操作的时候,比如调用ToUpper()或者ToLower()把某个string每个字符转化成大写或者小写;调用SubString()取子串;会创建一个新的string,有时候会创建一些新的临时string。这样的操作会增加内存的压力。所有在对string作频繁操作的情况下,我们会考虑使用StringBuilder来高效地操作string。StringBuilder之所以能对string操作带来更好的performance,是因为在它的内部维护一个字符数组,而不是一个string来避免string操作带来的新的string的创建。

  StringBuilder是一个很好的字符累加器,我们应该充分地利用这一个功能:

StringBuilder sb = new StringBuilder();
sb.Append(str1
+ str2);

 

  最好写成

StringBuilder sb = new StringBuilder();
sb.Append(str1);
sb.Append(str2);

 

  避免创建一个新的临时string来保存str1 + str2。

  再比如下面的Code

StringBuilder sb = new StringBuilder();
sb.Append(WorkOnString1());
sb.Append(WorkOnString2());
sb.Append(WorkOnString3());

 

  最好写好吧WorkOnString1,WorkOnString2,WorkOnString3定义成:

WorkOnString1(StringBuilder sb)
WorkOnString2(StringBuilder sb)
WorkOnString3(StringBuilder sb)

 

  3. 高效地进行string的比较操作

  我们知道,对象之间的比较有比较Value和比较Reference之说。一般地对Reference进行比较的速度最快。对于string,在字符串驻留的前提下,我们可以把对Value的比较用Reference的比较来代替从而会的Performance的提升。

  此外,对于忽略大小写的比较,我们最好使用string的static方法Compare(string strA, string strB, bool ignoreCase)。也就是说:

if(str1.ToLower()==str2.ToLower())

 

  最好写成

Ifstring. Compare(str1,str2,true))
0
相关文章