<From C++ To C#>非驴非马的string

System.String直接继承于System.Object,所以它绝对是一个引用类型。但是——

它有昵称,叫string,也许是为了配合STL中的string吧。

创建一个string对象也不用new,直接赋值就可以了 string str=”123”;

string的比对跟值类型相似,是按内容比对,而不是按地址比对。如果两个string都是 "A"那他们就是相等的。

 

不管怎么说string还是很好用的。它有我们熟悉的转义符,它有简单的+操作进行字符串连接,它有Length属性反映字符个数,还可以通过Split()方法进行切割。

除了多出一些好用的函数,还有两个地方是C++程序员不熟悉的。

1)@符号可以用在字符串前面,代表转义符失效。

平时我们写C++字符串会这样:

char str[] = "c:\\MyApp\\bin\\debug";
而现在,我们只需要这样:
string str=@"c:\MyApp\bin\debug";
真是简单多了。
2)string是不能改变的。
当我们写:
string s = "123";
s = s + "456";

的时候,系统并不是会原来s对象后面增加了123这个字符串,string是不能被改变的,还记得么。
系统的真实操作是重新创建了一个字符串,把s和123内容赋值在里面,并把这个字符串的引用赋值给s。
我们再进一步考虑这个问题,string是一个饮用对象,也就是说s会创建在堆里面。,然后照我们刚才所说,系统重新创建了一个字符串以存放s和123结合的内容,这样,现在堆里就有2个字符串对象了。系统最后把第二个字符串对象的引用赋值给s。也就是说s现在指向了新的内存地址,那么第一个字符串的内存地址还存在么?当然存在!
string s="123";
s = s+"345";
s = s+"456";
s = s+"567";
...

现在,我们的堆里面会有很多string的内存存在,等着被其他人 “delete”的时候才能够被释放。这样也太浪费了吧。

确实如此,如果需要对字符串进行修改操作的时候,我们并不推荐用string这个对象,而是用System.Text.StringBuilder。StringBuilder的内容是可以跟着改变的,这样就避免了刚才的问题。

现在来更正一下前面的代码吧
StringBuilder sb= new StringBuilder("123");
sb.Append("345");
sb.Append("456");
...

posted @ 2010-07-04 19:56  桔红糕  阅读(204)  评论(0编辑  收藏  举报