不经常但有时我需要使用String.Trim()
删除字符串的空格
如果自上次修剪编码后的时间较长,我写道:
string s = " text ";
s.Trim();
并且惊讶为什么s 不改变了。我需要写一下:
string s = " text ";
s = s.Trim();
为什么一些字符串方法以这种(非常直观的)方式设计?字符串有什么特别之处吗?
答案 0 :(得分:23)
答案 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
可以使本地副本修改它并返回修改后的字符串。