.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命名空间下
- 可变实例
- 由于对现有实例进行了新的更改,因此显示了更好的性能