二十七:使用String类型(二)
String对象是不可变的(immutable),也就是说,字符串在创建之后就不能再改变,使字符串不可变有几个好处,首先,它允许在一个字符串上执行各种操作,而不实际地改变字符串,如下:
if(s.ToUpperInvariant().Substring(10,20).EndsWith(".EXE"))
{
//...
}
在此,ToUpperInvariant返回一个新的字符串,它没有修改字符串s的字符。在ToUpperInvariant返回的字符串上执行的Substring操作也返回一个新的字符串,然后这个字符串由EndsWith进行检查。ToUpperInvariant、Substring创建的两个临时字符串不会由应用程序长久的引用,垃圾收集器会在以后回收它们的内存。如果执行大量的字符串操作,便在堆一创建大量的String对象,造成更加频繁的垃圾收集,从而妨碍应用程序的恨不能。要想高效的执行大量字符串操作,最好使用StringBuilder类。
使字符串不变,还意味着在操作或访问一个字符串时不会发生线程同步问题,除此之外,CLR可以通过单个String对象来共享多个完全一致的内容,这样能减少系统中的字符串数量,从而节省内存。