字符串和字符串生成器

时间:2010-01-04 04:27:00

标签: .net string stringbuilder

.NET中的字符串和字符串构建器有什么区别?

4 个答案:

答案 0 :(得分:5)

字符串是不可变类型。在执行像串联这样的字符串操作的批次时,它具有糟糕的性能特征。

另一方面,Stringbuilders通过保持不断增长的缓冲区来克服这个弱点,这样每个连接都不太可能需要分配新的字符串。

由于字符串构建器会增加一些开销,因此只有在要完成一些重要的字符串工作时(例如在循环中)才真正需要它们。如果您的代码很快,请不要担心。如果不是,请使用分析器查看此问题是否对您的情况有影响。

最后一点说明:这个答案实际上与ASP.NET无关 - 对于所有.net和许多其他语言中的字符串也是如此。

答案 1 :(得分:1)

http://en.csharp-online.net/CSharp_String_Theory%E2%80%94String_vs._StringBuilder

基本上,String是不可变的 - 每次操作一个都需要在内存中重新创建。 StringBuilder更容易记忆,几乎在所有情况下,当你处理重复的字符串连接和其他操作操作时会更快。

您可以在此SO帖子中找到更好的讨论:String vs. StringBuilder

答案 2 :(得分:1)

字符串是 immutable ,stringbuilder是可变的。

  

面向对象和功能   编程,一个不可变的对象是一个   状态无法修改的对象   创建之后。这是在   与可变对象形成鲜明对比   可以在创建后进行修改。

     

不可变对象通常很有用   因为一些昂贵的操作   复制和比较可以省略,   简化程序代码和   加快执行速度。然而,制作一个   对象不可变通常是   如果对象包含a,则不合适   大量可变数据。   因此,许多语言允许   对于不可变和可变的   对象。

每次对字符串对象进行串联时,都会使用新引用创建新的字符串对象,并将其分配给该对象。旧对象仍然存在于内存中。

答案 3 :(得分:0)

尽管.Net中的概念相同,但我想从Java的角度回答您的问题。在Java中,我们有一个称为java.lang的包(一个包是一个类的集合),String和StringBuilder是属于该包的两个类,其他类可以使用它们来创建实例。现在,b / w字符串和字符串生成器的区别是字符串对象是不可变的,这意味着这些对象的内容无法修改,因为它们是常量,而StringBuilder类的对象是可变的,意味着它们的内容可以修改。

例如:-

package anypackagename;

    package learningJava;

    public class DemoString 
    {
          public static void main(String... args) 
          {
            StringBuilder S2 = new StringBuilder("My name is");  
            System.out.println("S2 is: "+S2 );
            System.out.println("Hashcode of S2 before append "+ S2.hashCode());
            String S1 = "I live in";
            System.out.println("S1 is: "+S1 );
            System.out.println("Hashcode of S1 before concat "+ S1.hashCode());
            diff(S1,S2);
          }

          public static void diff(String S1, StringBuilder S2)
         {
              System.out.println("\n" );
              S2 = S2.append(" Amritansh Upadhyay");
              System.out.println("S2 is: "+S2 );
              System.out.println("Hashcode of S2 after after " +S2.hashCode());
              S1 = S1.concat("Bangalore");
              System.out.println("S1 is: "+S1 );
              System.out.println("Hashcode of S1 after concat" +S1.hashCode());
         }
    }

哈希代码(引用变量S1的值)随附加的字符串更改,但(引用变量S2的值)的值未更改。

enter image description here