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

本文关键字:修剪 对象 String Trim 为什么 | 更新日期: 2023-09-27 18:31:19

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

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

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

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

为什么

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

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

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

从 MSDN:

字符串是不可变的 - 字符串对象的内容不能 创建对象后更改,尽管语法使其 看起来好像你可以做到这一点。

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

  s = s.Trim();

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

字符串

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

同样重要的是要记住,如果您需要对字符串进行大量修改,最好使用 StringBuilder ,它的行为类似于"可变"字符串,并且执行此类操作更有效。

正如在 MSDN 库中编写的那样:

字符串对象称为不可变(只读),因为它的值 创建后无法修改。似乎 修改一个字符串对象实际上返回一个新的字符串对象 包含修改。

由于字符串是不可变的,因此字符串操作例程 对看似单个的内容执行重复添加或删除 字符串可能会造成显著的性能损失。

请参阅此链接。

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

比方说

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

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

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