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

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

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

并且惊讶为什么s 没有改变。 我需要写:

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

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

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

  s = s.Trim(); 

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

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

记住,如果你需要对一个字符串进行大量修改,那么最好使用一个StringBuilder ,它的行为就像一个“可变”的字符串,并且它更有效地进行这种操作。

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

来自MSDN :

字符串是不可变的 – 创建对象后,字符串对象的内容无法更改,尽管语法使其看起来好像可以执行此操作。

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

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

因为字符串是不可变的,所以对看起来像单个字符串执行重复添加或删除的字符串操作例程可能会严重影响性能。

看到这个链接 。

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

让我们说

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

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

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