对字符串应用Trim()而不给变量赋值

本文关键字:变量 赋值 字符串 应用 Trim | 更新日期: 2023-09-27 18:10:37

是否有可能将Trim()应用于字符串而不分配给新的或现有的变量?

var myString = "  my string  ";
myString.Trim();
// myString is now value "my string"

而不是把它赋值给一个新的变量或它自己?

var myString = "  my string  ";
myString = myString.Trim();
// myString is now value "my string"

对字符串应用Trim()而不给变量赋值

不,这是不可能的(在语言的使用范围内)。

. net中的String类是不可变的,这意味着特定的字符串永远不会改变。这允许代码在方法之间传递字符串,而不必复制字符串以防止原始字符串发生变化。


字符串存储在内存的某个地方,所以如果你去挖掘它,你可以改变对象的内容,从而改变字符串的值。然而,这违反了字符串在语言中的工作规则,并且您可能最终更改了在您没有预料到的地方使用的字符串。

字符串被编译器保留,这意味着即使你在代码的几个地方写了" my string ",它在编译时也只会是一个字符串对象。如果你想改变这个字符串,你需要在所有使用它的地方改变它。

的例子:

string test = "My string";
unsafe {
  // Note: example of what NOT TO DO!
  fixed (char* p = test) {
    *p = 'X';
  }
}
string another = "My string";
Console.WriteLine(another);
输出:

Xy string

为了形式化注释,字符串是不可变的,不能像您想要的那样在行内更改。

根据MSDN:

String对象的值是顺序集合的内容,该值是不可变的(即只读)。

它继续更深入地讨论不变性:

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

因此,您不能编写一个方法(即使作为扩展,因为thisref不能一起使用),这会导致底层字符串在物理上被修剪并返回在同一行中。

直接的答案是否定的,因为一旦有了字符串对象,就不能更改它。如果你需要一个缺少这些空格的字符串,你别无选择,只能让。net库和/或VM为你分配另一个被修剪过的字符串。

如果这个分配对你来说是不可接受的,你必须更深入地研究。您是否可以修改获取或汇编该字符串的代码,或者更改您的方法,使字符串从一开始就不获取空格?

根据原始字符串是如何形成的,有许多不同的方法可以尝试组装这样一个字符串。

天真的答案是使用StringBuilder,然而,根据您的约束,这可能不合适。每次调用StringBuilder.Append()时,它都会将字符串数据复制到自己的内部缓冲区中;然后,当你最终调用StringBuilder.ToString()时,它从内部缓冲区执行另一次复制到它组装的最终字符串对象中,并返回给你。

根据具体情况,如果您的字符串部分是字符串对象的形式,则调用string.Concat(string[])可能是有效的。

…然而,还有其他方法。使用不安全/固定语句,您可以从头开始初始化自己的字符串。这正是string自己的方法的工作方式,如string.Joinstring.Trim()。您自己也可以这样做,但是需要非常小心地处理字符串,并且在技术上也是违反语言规范的。

如果你发现自己正走在这条路上——手动初始化自己的字符串——我有一篇文章可能会提供一些帮助:

是否有可能仅使用单个分配连接字符串列表?

不行,你不能这么做。最接近的解决方案是:

var myString = "  my string  ".Trim();