String 和 StringBuilder 的区别和使用环境?

GoldWood 2008-08-28 12:06:52
我先申明,我是看过书了,看了之后更糊涂了,这两个类型除了内存使用方式不同外还有什么区别,在书上及其它介绍上来看StringBuilder比String要优秀,那么为什么还要有String的这类型的使用方式呢,还有既然有了这两种方式,那么在什么情况下使用那种类型比较合理呢,优点又在哪里呢
...全文
15638 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
码农_人生 2012-04-24
  • 打赏
  • 举报
回复
该结了
rr998 2012-03-15
  • 打赏
  • 举报
回复
看完了,明白了,呵呵,收藏了~~
cca313 2011-12-12
  • 打赏
  • 举报
回复
学习学习~~ 受用了。
alun0624 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 fryhunter 的回复:]

string是常量,不可变。stringbuilder可变。自己认真理解这里的可变与不可变。楼上一个小白来 了句string s="0";s="1"来说明string是可变的,你懂不懂什么叫做内存分配啊,真是无语了。楼上有一个娃举得例子是哪个3个string,一个string的那个,其实他理解对了,只是别的地方知识欠缺了,所以误人子弟了。用下面这个例子说吧。

string s="aa"; ……
[/Quote]
string难道不是引用类型的??
zhuiwenwen 2011-07-25
  • 打赏
  • 举报
回复
顶顶顶。
hzdwf 2011-07-07
  • 打赏
  • 举报
回复
大家解释的很详细,对新手帮助很大!
mazhipeng888 2011-06-12
  • 打赏
  • 举报
回复
string对象一旦生成,就不可改变,所以每次使用System.String类中的方法时,都需要在内存中创建一个新的字符串的对象,这会分配新的空间给该新的对象。
如果不创建新的对象我们可以使用StringBuildet类。
在相同字符串的许多操作下,使用StringBuilder类会比使用String对象更有效率。对于少量的字符串的拼接的操作,使用String使用起来会比较方便。
zhmjppp 2011-06-07
  • 打赏
  • 举报
回复
今天学习了。。。。
jiuwulang 2011-02-26
  • 打赏
  • 举报
回复
各路高人各抒已见!谢谢啊~~
_程序员 2010-11-23
  • 打赏
  • 举报
回复
呵呵,不错,明白 了
lgf11088 2010-07-07
  • 打赏
  • 举报
回复
当要连接的字符串比较长或者比较频繁时,用stringbuilder 效率比较高
fryhunter 2010-06-30
  • 打赏
  • 举报
回复
string是常量,不可变。stringbuilder可变。自己认真理解这里的可变与不可变。楼上一个小白来 了句string s="0";s="1"来说明string是可变的,你懂不懂什么叫做内存分配啊,真是无语了。楼上有一个娃举得例子是哪个3个string,一个string的那个,其实他理解对了,只是别的地方知识欠缺了,所以误人子弟了。用下面这个例子说吧。

string s="aa"; s +="bb"; 则内存中存在了aa bb aabb 三个
stringbuilder ss="aa"; ss.Append("bb")。则内存中只有两个 "bb" "aabb" 此处少了一个"aa",其实是因为stringbuilder是可变的,"aa"变成了"aabb",而不是重新分配新空间。

楼主其实问的是为什么是stringbuilder比string好,还是存在string。因为stringbuilder是引用类型的,一开始分配的时候需要比较多的空间,而string是值类型的。这个有点struct与class的利害比较了。如果不是频繁拼接的情况下,。string的性能明显好于stringbuilder,所以楼上有一个人说的很对,如果频繁拼接就用stringbuilder,如果是展现那么用string。
传说中的张 2010-06-14
  • 打赏
  • 举报
回复
mark
wei_wu49036233 2010-04-17
  • 打赏
  • 举报
回复
....学习
wangyan_world 2010-03-31
  • 打赏
  • 举报
回复
学习
学习
bdx808 2010-03-30
  • 打赏
  • 举报
回复
学习
收藏
chenymimi 2010-01-06
  • 打赏
  • 举报
回复
别人说builder比string效率高,那我就用builder了,至于什么区别,我也不清楚了。
whengjun 2009-12-23
  • 打赏
  • 举报
回复
var str = string.Format("{0}、{1} {2} {3} {4} {5} {6} {7}"
whengjun 2009-12-23
  • 打赏
  • 举报
回复
var str = string.Format("{0}、{1} {2} {3} {4} {5} {6} {7}"
wubaodong 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 lude8880 的回复:]
引用 25 楼 liuhz_jsmstc 的回复:
StringBuilder表示可变字符串
String表示不可变字符串

比如你在编程时,声明一个字符串变量,string aa="";
又比如,你在编程时,拼凑SQl语句:
如:
stringBuilder strbu=new stringbulider;
strbu.append(" select * from table1");
strbu.append(" where 1=1");
strbu.append(" and 2=2");
return strbu.tostring();

这样的情况就用stringbuilder

string怎么不可变了?
string s="0";
s="1";

string 和string builder 功能上没区别,只有效率的区别
[/Quote]

我的理解。
string s="0";
这句中,堆存储区中NEW出一个真正的String类的对象"0"
而s是什么?s只不过只在栈中创建的引用变量,类似C中的指针,只分配了一小段内存,里面只是存放了上述对象"0"的地址。
等效于
String s = new String("0");

s="1";
这句话做了什么?首先再次在堆中NEW出一个String类的对象"1";该对象与前面的"0"没任何关系.
然后将对象"1"的地址赋值给栈中的引用变量s,就是说s的值发生了变化,而对象"0","1"没有任何变化。
等效于
s = new String ("1");

就是说变化的是引用变量s的值,使得通过s中的地址可以访问到对象"1"了。而这时的对象"0"没有任何变化,并且也没有任何方法可以改变它。


加载更多回复(45)

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧