1

.NET 中的字符串和字符串生成器有什么区别?

4

4 回答 4

5

字符串是不可变的类型。在执行大量字符串操作(如连接)时,它的性能特征很差。

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

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

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

于 2010-01-04T04:32:03.260 回答
1

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

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

您可能会在这篇 SO 帖子中找到更好的讨论:String vs. StringBuilder

于 2010-01-04T04:28:22.547 回答
1

string 是不可变的,而 stringbuilder 是可变的。

在面向对象和函数式编程中,不可变对象是其状态在创建后无法修改的对象。这与可变对象相反,可变对象可以在创建后进行修改。

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

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

于 2010-01-04T04:29:21.903 回答
0

我想从 Java 的角度回答您的问题,尽管 .Net 中的概念是相同的。在Java中,我们有一个包(包是类的集合),称为java.lang,String和StringBuilder是属于这个包的两个类,可以被其他类用来创建实例。现在,b/w String 和 String builder 的区别在于 String 对象是不可变的,这意味着这些对象的内容不能被修改,因为它们是常量,而 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());
         }
    }

Hashcode(Ref 变量 S1 的值)随着附加的字符串而改变,但(Ref 变量 S2 的值)的值没有改变。

在此处输入图像描述

于 2020-05-20T09:37:16.490 回答