为什么`String.Trim()`不修剪对象本身?

时间:2012-04-17 11:59:21

标签: c#

不经常但有时我需要使用String.Trim()删除字符串的空格 如果自上次修剪编码后的时间较长,我写道:

string s = " text ";
s.Trim();

并且惊讶为什么s 改变了。我需要写一下:

string s = " text ";
s = s.Trim();

为什么一些字符串方法以这种(非常直观的)方式设计?字符串有什么特别之处吗?

4 个答案:

答案 0 :(得分:23)

字符串是不可变的。任何字符串操作都会生成一个新字符串,而不会更改原始字符串。

来自MSDN

  

字符串是不可变的 - 字符串对象的内容不能   在创建对象后更改,尽管语法可以实现   好像你可以这样做。

答案 1 :(得分:7)

s.Trim()创建原始字符串的新剪裁版本并返回它,而不是将新版本存储在s中。因此,您需要做的是将修剪后的实例存储在变量中:

  s = s.Trim();

所有字符串方法和扩展方法都遵循此模式。

字符串是不可变的这一事实与使用此模式的决定无关,而是与字符串保存在内存中的事实有关。此方法可以设计为在内存中创建新的已修改字符串实例,并将该变量指向新实例。

记住,如果你需要对字符串进行大量修改,那么最好使用StringBuilder,它的行为类似于“可变”字符串,并且它更有效。的运作。

答案 2 :(得分:2)

因为它是在MSDN Library中编写的:

  

String对象称为immutable(只读),因为它的值   创建后无法修改。出现的方法   修改一个String对象实际上返回一个新的String对象   包含修改。

     

因为字符串是不可变的,所以字符串操作例程   对看似单一的内容进行重复添加或删除   字符串可以显着降低性能。

请参阅此link

答案 3 :(得分:1)

除了所有好的答案外,我也觉得原因是Threadsaftey。

让我们说

string s = " any text "; s.Trim();

当你这样说时,没有什么能阻止其他线程修改s。如果修改了相同的字符串,让我们说另一个线程从s中删除'a',那么s.Trim()的结果是什么?

但是当它返回新字符串时,虽然它被另一个线程修改,但trim可以使本地副本修改它并返回修改后的字符串。