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

brg*_*ner 4 c#

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

string s = " text ";
s.Trim();
Run Code Online (Sandbox Code Playgroud)

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

string s = " text ";
s = s.Trim();
Run Code Online (Sandbox Code Playgroud)

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

Tud*_*dor 23

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

来自MSDN:

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

  • 很多人都期待别的东西!许多程序员很难习惯字符串不变性; 我已经在代码中编写了像`s.Trim()`这样的语句,即使是经验丰富的程序员.我敢说,如果@ brgerner的建议得到实施,那就远远不够了. (2认同)

Jot*_*aBe 7

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

  s = s.Trim();
Run Code Online (Sandbox Code Playgroud)

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

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

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