CSDN-CSDN社区-.NET技术-.NET Framework

收藏 为什么在.NET类库中strint和stringBuilder同时存在这两个类[问题点数:20]

  • lovely520
  • (errol)
  • 等 级:
  • 结帖率:
楼主发表于:2008-04-14 20:44:44
为什么在.NET类库中strint和stringBuilder同时存在这两个类

希望高手给我回答下,急要到。谢谢.....
回复次数:18
#1楼 得分:0回复于:2008-04-14 21:17:02
一个是固定容量的string,一个是可扩展的string。
两者处理不同的字符操作时在性能上有差异。
#2楼 得分:0回复于:2008-04-14 22:29:26
你可以通过他们所在的命名空间名字 来确定他们的意义。
不过,string多用在声明变量上 从.NET来说比较规范
而stringBuffer多用在字符串的组拼上 他的效率比string高很多
具体的你可以google一下。
#3楼 得分:0回复于:2008-04-24 14:38:40
stringBuilder是可变的string
例如:stringBuilder str = "你好!";
    str += "你好!";
    Console.WriteLine(str);//输出为"你好!你好!"(str指向的还是一个对象)
而string str = "你好!";
  str += "你好!";
  这时 str 指向对象“你好!你好!”,而"你好!"没有引用了,成为垃圾!会被垃圾回收器自动清除,但影响效率,而stringBuilder 没有产生垃圾!
#4楼 得分:0回复于:2008-04-24 16:42:08
当连接较多的字符串时,用后者比用前者效率高很多很多
  • badtank用户头像
  • badtank
  • (人是人他妈生的)
  • 等 级:
#5楼 得分:0回复于:2008-04-24 17:31:00
http://channel9.msdn.com/ShowPost.aspx?PostID=14932
#6楼 得分:0回复于:2008-04-24 23:01:17
String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。

虽然 StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前 StringBuilder 对象容纳的字符串长度混淆在一起。例如,可以创建 StringBuilder 类的带有字符串“Hello”(长度为 5)的一个新实例,同时可以指定该对象的最大容量为 25。当修改 StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。可以使用重载的构造函数之一来指定 StringBuilder 类的容量。下面的示例指定可以将 MyStringBuilder 对象扩充到最大 25 个空白。

EG :
Dim MyStringBuilder As New StringBuilder("Hello World!")
MyStringBuilder.Insert(6, "Beautiful ")
Console.WriteLine(MyStringBuilder)


EG:
Dim MyStringBuilder As New StringBuilder("Hello World!")
MyStringBuilder.Remove(5, 7)
Console.WriteLine(MyStringBuilder)

  • zhnzzy用户头像
  • zhnzzy
  • (学习中~~)
  • 等 级:
#7楼 得分:0回复于:2008-04-25 16:02:54
固定长度和不固定长度吧
  • zhnzzy用户头像
  • zhnzzy
  • (学习中~~)
  • 等 级:
#8楼 得分:0回复于:2008-04-25 16:03:28
建议去看看stringBuilder的用法,你会发现不同之处的
#9楼 得分:0回复于:2008-04-30 06:43:23
接分是王道!
#10楼 得分:0回复于:2008-05-01 11:04:15
等待牛人来答.
#11楼 得分:0回复于:2008-05-04 10:44:41
主要还是效率问题.如果对字符串频繁操作,用stringbuilder,效率会高些.
#12楼 得分:0回复于:2008-05-04 11:44:36
6楼的。
  • amingo用户头像
  • amingo
  • (http://shop3573)
  • 等 级:
#13楼 得分:0回复于:2008-05-05 11:10:08
为什么你要问为什么?
#14楼 得分:0回复于:2008-05-05 13:29:18
有的人喜欢问为什么.除了效率区别,再就是String 是可以直接用,不用new,还有就是线程安全的.StringBuilder不能保证所有的是线程安全的
#15楼 得分:0回复于:2008-05-05 17:21:46
String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。
虽然 StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前 StringBuilder 对象容纳的字符串长度混淆在一起。例如,可以创建 StringBuilder 类的带有字符串“Hello”(长度为 5)的一个新实例,同时可以指定该对象的最大容量为 25。当修改 StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。可以使用重载的构造函数之一来指定 StringBuilder 类的容量。
  • torss用户头像
  • torss
  • (S.S.)
  • 等 级:
#16楼 得分:0回复于:2008-05-09 00:59:47
system.string is immutable
system.stringbuilder was designed with the purpose of having a mutable string where a variety of operations can be performed
------------------------------------------------------------------------------------------------
String and StringBuilder class stores strings. But when you cannot change a String object after creating one.
eg: String name = "Prasad";
By saying you cannot change the name object means you cannot change the value in name object internally. When you change the name object value to something else, a new String object is creating in memory and assign the new value.
eg: name = "Prasad Reddy";

A new name object is creating in memory and the value "Prasad Reddy" is assinging to the newly created space.

But StringBuilder class occupies the same space even if you change the value.

If you are doing string concatenation StringBuilder class is far better in performance than String class.

You can use StringBuilder's Append() method to use concatenation.


#17楼 得分:0回复于:2008-05-10 11:41:50
简单地说,string是我们传统使用的方法,只要字符串处理操作不多,一般使用string。
string是System.String类型的别名,在我们创建1个string类型的变量并赋予初始值时,就在托管堆创建了1块空间存储这个初始值,而这个变量即为这块空间的引用。这块空间一旦建立就无法更改,如果修改这个变量的值(更改字符串),实际上是在托管堆创建了另1块空间存储新值,变量的引用修改为指向新的空间。这时,托管堆用于存储初始值的空间失去了变量引用,将由垃圾收集器来处理,不过不能保证马上被处理。在涉及大量字符串操作时,其效率的下降可想而知,所以才有了System.Text.StringBuilder,StringBuilder可提供对底层缓冲区的直接访问,所以操作字符串效率高很多。
  • gyc用户头像
  • gyc
  • (Son of VB.NET)
  • 等 级:
#18楼 得分:0回复于:2008-05-10 14:23:23
String,实际上是 引用类型,这是.NET 里经常容易弄错的

这样每次赋值的时候,实际上都是建立了一个新的字符串(原来的还是存在的)

StringBuilder  也是处理字符串的,不过和String不同, 内部使用的是Char数组, 因此  相对的 ,在修改的时候节省资源
相关问题
在C#中如何调用WINDOWS API .NET技术/ C# - CSDN社区community.csdn.net
急救﹐請問在WEB APPLICATION中如何調用API函數﹖ .NET技术/ ASP.NET ...
急!!!,有关c# 中调用API函数的问题(msn:franklitian6@hotmail)[分 ...
C#中怎么调用命名管道的WinAPI? .NET技术/ C# - CSDN社区community ...
SetWindowPlacement 这个API在C#中怎样调用? .NET技术/ C# - CSDN社区 ...
API的调用问题.NET技术/ C# - CSDN社区community.csdn.net