string和StringBuilder在c#中的区别
我想知道string
和StringBuilder
之间的区别,也需要一些例子来理解。
一个string
实例是不可变的。 创build后无法更改。 任何似乎改变string的操作都会返回一个新的实例:
string foo = "Foo"; // returns a new string instance instead of changing the old one string bar = foo.Replace('o', 'a'); string baz = foo + "bar"; // ditto here
不可变的对象有一些很好的属性,比如它们可以跨线程使用而不用担心同步问题,或者你可以简单地直接发出你的私有支持字段而不用担心有人改变他们不应该改变的对象(参见数组或可变列表,如果不需要的话,在返回它们之前经常需要被复制)。 但是,当不小心使用它们时,它们可能会造成严重的性能问题(几乎任何东西 – 如果你需要一个以执行速度为荣的语言的例子,那么看看C的string操作函数)。
当你需要一个可变string,比如你正在构build一个片段或者你改变了很多东西的地方,那么你需要一个StringBuilder
,它是一个可以被改变的字符缓冲区。 这在很大程度上影响了性能。 如果你想要一个可变的string,而用一个普通的string
实例来做,那么你最终会不必要地创build和销毁大量的对象,而一个StringBuilder
实例本身将会改变,否定了许多新对象的需要。
简单的例子:下面会让很多程序员畏惧:
string s = string.Empty; for (i = 0; i < 1000; i++) { s += i.ToString() + " "; }
你最终会在这里创build2001string,其中2000个被丢弃。 使用StringBuilder的同一个例子:
StringBuilder sb = new StringBuilder(); for (i = 0; i < 1000; i++) { sb.Append(i); sb.Append(' '); }
这应该放在内存分配器上的压力要小得多:-)
但应该注意的是,C#编译器对于string来说是相当聪明的。 例如,下面这行
string foo = "abc" + "def" + "efg" + "hij";
将被编译器join,在运行时只留下一个string。 同样,行如
string foo = a + b + c + d + e + f;
将被重写
string foo = string.Concat(a, b, c, d, e, f);
所以你不必支付五个无意义的连接,这是处理这种连接的一种天真的方式。 这不会像上面那样把你保存在循环中(除非编译器展开循环,但我认为只有JIT实际上可以这样做,最好不要打赌)。
string和StringBuilder之间的区别?
串:
string是不可变的。 不可变的手段,一旦我们创buildstring对象,我们不能修改。 任何像insert,replace或append这样的操作都会改变string,只会丢弃旧值,并会在内存中创build新的实例来保存新的值。
例:
string str = "hi"; str += "hello"; // New string instance will be created, instead of changing the old one str += "hw ru"; // Again new string instance will be created, instead of changing the old one
StringBuilder的:
string生成器是可变的,这意味着一旦我们创buildstring生成器对象,我们可以执行任何操作,如插入,replace或追加,而不是每次创build新的实例。
例:
StringBuilder sb = new StringBuilder(""); sb.Append("hi"); sb.Append("hello"); string str = sb.ToString();
在这里以示例格式阅读“String和StringBuilder之间的差异”的更多信息。
string是不可变的,这意味着当你创build一个string时你永远不能改变它,而是会创build一个新的string来存储新的值,如果你需要更改一个stringvariables的值,这可能是低效率的。
Stringbuilder可以用来模拟一个可变的string,所以当你需要更改一个string很好。
string与StringBuilder
- 串
- 在System命名空间下
- 不可变(只读)实例
- 性能会随着价值的不断变化而降低
- 线程安全
- StringBuilder(可变string)
- 在System.Text命名空间下
- 可变实例
- 由于对现有实例进行了新的更改,因此显示了更好的性能
有关使用ObjectIDGenerator的大量示例的关于此主题的描述性文章,请点击此链接
相关的Stackeoverflow问题: 当string不改变在C#中的string的可变性?
stringstring实例是不可变的,也就是说,在创build之后,我们无法更改它。 如果我们对String执行任何操作,它将返回一个新实例(在内存中创build一个新实例),而不是修改现有的实例值。
StringBuilder StringBuilder是可变的,也就是说,如果我们在StringBuilder上执行任何操作,它将更新现有的实例值,它不会创build新的实例。
http://www.dotnetlearners.com/blogs/view/180/Difference-between-String-and-StringBuilder.aspx
从StringBuilder类文档 :
String对象是不可变的。 每次使用System.String类中的某个方法时,都会在内存中创build一个新的string对象,这需要为该新对象重新分配空间。 在需要对string进行重复修改的情况下,与创build新的String对象相关的开销可能会很高。 当你想修改一个string而不创build一个新的对象时,可以使用System.Text.StringBuilder类。 例如,使用StringBuilder类可以在循环中将许多string连接在一起时提升性能。
当你需要在多个步骤中构buildstring时,StringBuilder将帮助你。
而不是这样做:
String x = ""; x += "first "; x += "second "; x += "third ";
你做
StringBuilder sb = new StringBuilder(""); sb.Append("first "); sb.Append("second "); sb.Append("third"); String x = sb.ToString();
最后的效果是一样的,但StringBuilder将使用更less的内存,运行速度会更快。 而不是创build一个新的string,它是两个连接,它将分别创build块,只有在最后它将它们联合起来。
主要区别:
string是不可变的。 这意味着你根本不能修改string,修改的结果是新的string。 如果您计划追加到string,这是无效的
StringBuilder是可变的。 它可以以任何方式修改,并且不需要创build新的实例。 工作完成后,可以调用ToString()来获取string。
string可以参与实习,这意味着具有相同内容的string可能具有相同的地址。 StringBuilder不能被拦截。
string是唯一可以引用文字的类。
一个string是一个不可变的types。 这意味着每当你开始连接string时,你每次都创build新的string。 如果你这么做了很多次,最终会产生大量的堆栈开销和内存不足的风险。
StringBuilder实例用于将string附加到同一个实例,当您调用ToString方法时创build一个string。
由于实例化一个StringBuilder对象的开销,微软说,当你有超过5-10个string连接时,它是有用的。
对于示例代码,我build议你看看这里:
http://msdn.microsoft.com/en-us/library/system.string.aspx http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx
http://msdn.microsoft.com/en-us/library/2839d5h5(VS.71).aspx
Grz,Kris。
一个string(System.String)是一个在.NET框架中定义的types。 String类不可变。 这意味着每当您对System.String实例执行操作时,.NET编译器都会创build一个新的string实例。 这个操作对于开发者来说是隐藏的。
System.Text.StringBuilder是表示可变string的类。 这个类提供了一些有用的方法,使用户能够pipe理由StringBuilder包装的String。 注意,所有的操作都是在同一个StringBuilder实例上进行的。
微软鼓励使用StringBuilder的原因在内存使用方面更为有效。
String的连接复杂度是O(N2),而StringBuffer的连接复杂度是O(N)。 所以在循环中使用连接可能会有性能问题,因为每次创build大量新对象。
你可以使用克隆方法,如果你想通过string迭代string生成器。它返回一个对象,所以你可以转换为string使用ToString方法… 🙂
string是不可变的,即如果你改变它的值,旧的值将被丢弃,并在堆上创build新的值,而在string生成器中,我们可以修改现有的值而不创build新的值。 所以性能明智的string生成器是有益的,因为我们不必占用更多的内存空间。
系统。 string是可变的对象意思是创build后不能修改,请参考下面的URL以便更好地理解
http://developer-insight.blogspot.com/2017/04/different-between-system.html