.net 字符串是不可变的,stringbuilder是可变的

.net 字符串是不可变的,stringbuilder是可变的,.net,.net,有人能举例说明吗 相关讨论: 无法编辑字符串的值,字符串对象的每个方法都返回一个新字符串,而不是更改原始字符串。另一方面,StringBuilder可以更改其内容(例如添加新字符串) 除非创建新字符串或将实例重新引用到其他字符串对象,否则无法更改原始字符串的内容。如果无法编辑字符串的值,字符串对象的每个方法都会返回一个新字符串,而不是更改原始字符串。另一方面,StringBuilder可以更改其内容(例如添加新字符串) 除非创建新字符串或将实例重新引用到另一个字符串对象,否则无法更改原始字符串

有人能举例说明吗


相关讨论:

无法编辑字符串的值,字符串对象的每个方法都返回一个新字符串,而不是更改原始字符串。另一方面,StringBuilder可以更改其内容(例如添加新字符串)


除非创建新字符串或将实例重新引用到其他字符串对象,否则无法更改原始字符串的内容。

如果无法编辑字符串的值,字符串对象的每个方法都会返回一个新字符串,而不是更改原始字符串。另一方面,StringBuilder可以更改其内容(例如添加新字符串)


除非创建新字符串或将实例重新引用到另一个字符串对象,否则无法更改原始字符串的内容。

将其设置为不可变的部分原因:

  • 不可变类型是线程安全的 意思是你可以传递一个字符串 不用担心,它已经被改变了
  • 如果 字符串可以更改

它们之所以成为不可变的一些原因:

  • 不可变类型是线程安全的 意思是你可以传递一个字符串 不用担心,它已经被改变了
  • 如果 字符串可以更改

C++中你可以这样做:

std::string hello = "Hello, world!\r\n";
hello[7] = 'W';

在C#中,你不能这样做。字符串不能更改。C++中的

你可以这样做:

std::string hello = "Hello, world!\r\n";
hello[7] = 'W';

在C#中,你不能这样做。字符串不能更改。

字符串对象是不可变的,一旦创建,就不能更改

string str;
//new string object constructed. str= new string("string1");
str="string1";
//again new object will be constructed str=new string("string1string2");
str=str+"string2" 
since a new object is created for every assignment, there is an overhead.
然而,字符串生成器类提供了一种有效的方法,可以将字符串的位重复地附加到已构造的对象中

StringBuilder str=new StringBuilder();
str.Append("string1");
str.Append("string2");

性能差异太小,无法在更少的赋值和连接操作上进行比较,但如果我们有更多的字符串操作,则从字符串切换到stringbuilder会带来显著的性能提升。

字符串对象是不可变的,一旦创建,就无法更改

string str;
//new string object constructed. str= new string("string1");
str="string1";
//again new object will be constructed str=new string("string1string2");
str=str+"string2" 
since a new object is created for every assignment, there is an overhead.
然而,字符串生成器类提供了一种有效的方法,可以将字符串的位重复地附加到已构造的对象中

StringBuilder str=new StringBuilder();
str.Append("string1");
str.Append("string2");
性能差异太小,无法在更少的赋值和串联操作上进行比较,但如果我们有更多的字符串操作,则从字符串切换到stringbuilder会带来显著的性能提升。

字符串是不可变的

这意味着一旦声明,就不能更改字符串

字符串生成器是可变的

这是可以执行的变体操作。我们可以更改字符串。

字符串是不可变的

这意味着一旦声明,就不能更改字符串

字符串生成器是可变的


这是可以执行的变化操作。我们可以更改字符串。

即使是一个老问题,我想我还是会回答

字符串(参考类型存储)

将字符串的值放在托管堆上,并使用指针指向它。如果更改字符串的值,新值将存储在托管堆的另一个位置,指针将更改为指向新位置。旧值保留在堆上,没有指向其位置的指针。最终可能会耗尽堆内存

这是一种安全保障。它确保了除非程序员对字符串进行物理更改(实际上是在堆栈上放置一个新值并更改指针),否则系统无法更改字符串。我认为没有办法将指针从堆上的新值更改为堆上的旧值


2010年10月20日编辑


StringBuilder(值类型存储)即使是一个老问题,我还是会回答

字符串(参考类型存储)

将字符串的值放在托管堆上,并使用指针指向它。如果更改字符串的值,新值将存储在托管堆的另一个位置,指针将更改为指向新位置。旧值保留在堆上,没有指向其位置的指针。最终可能会耗尽堆内存

这是一种安全保障。它确保了除非程序员对字符串进行物理更改(实际上是在堆栈上放置一个新值并更改指针),否则系统无法更改字符串。我认为没有办法将指针从堆上的新值更改为堆上的旧值


2010年10月20日编辑


StringBuilder(值类型存储)字符串的不变性[实例为只读]

    string s="hi";
    //now let s be address 1000
    s+=" there"; 
    //above concatination causes creation of new instance in address location other than 1000
    //with modified value "hi there"
stringbuilder的易变性[实例可以修改]

    StringBuilder sbr = new StringBuilder("My Favourite Programming Font is ");
    sbr.Append("Inconsolata")
//append operation only modifies existing instance of sbr rather than creating new instance
对于更有趣的示例和详细的讨论,强烈建议遵循

字符串与字符串生成器
  • 在系统命名空间下
  • 不可变(只读)实例
  • 当值发生连续变化时,性能会下降
  • 线程安全
  • StringBuilder(可变字符串)
  • 在System.Text命名空间下
  • 可变实例
  • 由于对现有实例进行了新的更改,因此显示了更好的性能
关于此主题的描述性文章,包含大量使用 ,跟随

相关堆栈溢出问题:


字符串[实例为只读]的不变性

    string s="hi";
    //now let s be address 1000
    s+=" there"; 
    //above concatination causes creation of new instance in address location other than 1000
    //with modified value "hi there"
stringbuilder的易变性[实例可以修改]

    StringBuilder sbr = new StringBuilder("My Favourite Programming Font is ");
    sbr.Append("Inconsolata")
//append operation only modifies existing instance of sbr rather than creating new instance
对于更有趣的示例和详细的讨论,强烈建议遵循

字符串与字符串生成器
  • 在系统命名空间下
  • 不可变(只读)实例
  • 当值发生连续变化时,性能会下降
  • 线程安全
  • StringBuilder(可变字符串)
  • 在System.Text命名空间下
  • 可变实例
  • 由于对现有实例进行了新的更改,因此显示了更好的性能